@@ -28,39 +28,72 @@ public static async Task ConnectTaskAsync(this Socket socket, EndPoint remoteEnd
2828 throw new ArgumentNullException ( nameof ( remoteEndPoint ) ) ;
2929 }
3030
31- var taskSetter = new TaskSetter < object > ( timeout ) ;
32- var asyncEventArg = new SocketAsyncEventArgs
31+ var token = new UserToken < object >
3332 {
34- UserToken = taskSetter ,
35- RemoteEndPoint = remoteEndPoint
33+ Socket = socket ,
34+ TaskSetter = new TaskSetter < object > ( timeout )
3635 } ;
3736
38- asyncEventArg . Completed += ConnectCompleted ;
39-
40- if ( socket . ConnectAsync ( asyncEventArg ) == false )
41- {
42- ConnectCompleted ( socket , asyncEventArg ) ;
43- }
37+ socket . BeginConnect ( remoteEndPoint , OnEndConnect , token ) ;
38+ await token . TaskSetter . Task ;
39+ }
4440
41+ /// <summary>
42+ /// 连接完成
43+ /// </summary>
44+ /// <param name="ar"></param>
45+ private static void OnEndConnect ( IAsyncResult ar )
46+ {
47+ var token = ar . AsyncState as UserToken < object > ;
4548 try
4649 {
47- await taskSetter . Task ;
50+ token . Socket . EndConnect ( ar ) ;
51+ token . TaskSetter . SetResult ( null ) ;
4852 }
49- finally
53+ catch ( Exception ex )
5054 {
51- asyncEventArg . Dispose ( ) ;
55+ token . TaskSetter . SetException ( ex ) ;
5256 }
5357 }
5458
59+
5560 /// <summary>
56- /// 连接完成
61+ /// 异步发送
62+ /// </summary>
63+ /// <param name="socket"></param>
64+ /// <param name="arraySegment">缓冲区</param>
65+ /// <param name="timeout">等待数据的超时时间</param>
66+ /// <exception cref="SocketException"></exception>
67+ /// <exception cref="TimeoutException"></exception>
68+ /// <returns></returns>
69+ public static async Task < int > SendTaskAsync ( this Socket socket , ArraySegment < byte > arraySegment , TimeSpan ? timeout )
70+ {
71+ var token = new UserToken < int >
72+ {
73+ Socket = socket ,
74+ TaskSetter = new TaskSetter < int > ( timeout )
75+ } ;
76+
77+ socket . BeginSend ( arraySegment . Array , arraySegment . Offset , arraySegment . Count , SocketFlags . None , OnEndSend , token ) ;
78+ return await token . TaskSetter . Task ;
79+ }
80+
81+ /// <summary>
82+ /// 发送完成
5783 /// </summary>
58- /// <param name="sender"></param>
59- /// <param name="e"></param>
60- private static void ConnectCompleted ( object sender , SocketAsyncEventArgs e )
84+ /// <param name="ar"></param>
85+ private static void OnEndSend ( IAsyncResult ar )
6186 {
62- var taskSetter = e . UserToken as TaskSetter < object > ;
63- taskSetter . SetResult ( null ) ;
87+ var token = ar . AsyncState as UserToken < int > ;
88+ try
89+ {
90+ var length = token . Socket . EndSend ( ar ) ;
91+ token . TaskSetter . SetResult ( length ) ;
92+ }
93+ catch ( Exception ex )
94+ {
95+ token . TaskSetter . SetException ( ex ) ;
96+ }
6497 }
6598
6699 /// <summary>
@@ -74,39 +107,48 @@ private static void ConnectCompleted(object sender, SocketAsyncEventArgs e)
74107 /// <returns></returns>
75108 public static async Task < int > ReceiveTaskAsync ( this Socket socket , ArraySegment < byte > arraySegment , TimeSpan ? timeout )
76109 {
77- var taskSetter = new TaskSetter < int > ( timeout ) ;
78- var asyncEventArg = new SocketAsyncEventArgs
110+ var token = new UserToken < int >
79111 {
80- UserToken = taskSetter
112+ Socket = socket ,
113+ TaskSetter = new TaskSetter < int > ( timeout )
81114 } ;
115+ socket . BeginReceive ( arraySegment . Array , arraySegment . Offset , arraySegment . Count , SocketFlags . None , OnEndReceive , token ) ;
116+ return await token . TaskSetter . Task ;
117+ }
82118
83- asyncEventArg . SetBuffer ( arraySegment . Array , arraySegment . Offset , arraySegment . Count ) ;
84- asyncEventArg . Completed += ReceiveCompleted ;
85-
86- if ( socket . ReceiveAsync ( asyncEventArg ) == false )
87- {
88- ReceiveCompleted ( socket , asyncEventArg ) ;
89- }
90-
119+ /// <summary>
120+ /// 接收完成
121+ /// </summary>
122+ /// <param name="ar"></param>
123+ private static void OnEndReceive ( IAsyncResult ar )
124+ {
125+ var token = ar . AsyncState as UserToken < int > ;
91126 try
92127 {
93- return await taskSetter . Task ;
128+ var length = token . Socket . EndReceive ( ar ) ;
129+ token . TaskSetter . SetResult ( length ) ;
94130 }
95- finally
131+ catch ( Exception ex )
96132 {
97- asyncEventArg . Dispose ( ) ;
133+ token . TaskSetter . SetException ( ex ) ;
98134 }
99135 }
100136
101137 /// <summary>
102- /// 接收完成
138+ /// 表示用户信息
103139 /// </summary>
104- /// <param name="sender"></param>
105- /// <param name="e"></param>
106- private static void ReceiveCompleted ( object sender , SocketAsyncEventArgs e )
140+ /// <typeparam name="T"></typeparam>
141+ private class UserToken < T >
107142 {
108- var taskSetter = e . UserToken as TaskSetter < int > ;
109- taskSetter . SetResult ( e . BytesTransferred ) ;
143+ /// <summary>
144+ /// socket
145+ /// </summary>
146+ public Socket Socket { get ; set ; }
147+
148+ /// <summary>
149+ /// 任务
150+ /// </summary>
151+ public TaskSetter < T > TaskSetter { get ; set ; }
110152 }
111153
112154 /// <summary>
0 commit comments