异步套接字:在发送所有数据之前阻止此线程

时间:2012-10-25 21:03:53

标签: c# .net sockets asynchronous iasyncresult

关于asynchronious sockets,我想知道在发送所有数据之前是否可以保留该线程?

使用Socket.BeginSend

public IAsyncResult BeginSend(
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
AsyncCallback callback,
Object state

我在buffer参数中发送数据。我想知道是否有可能阻止线程在所有数据真正从这里发送之前如何(不考虑是否在另一方接收数据)?所以我可以调用Socket.BeginReceive方法吗?

-

使用ManualResetEvent委托(我称之为“sendDone”)是否足够好?

示例:

 private static ManualResetEvent sendDone = new ManualResetEvent(false);
 //inisde a method call WaitOne() method:
 sendDone.WaitOne();

这够好吗?或者有更好的改变吗?

为ans

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用Send method上的Socket class,因为它会阻止调用线程,如下所示:

byte[] buffer = ...;

int bytesSent = socket.Send(bytes);

请注意,如果您真的想要阻止对BeginSend的调用,可以使用任务并行库来创建Task<TResult>,然后您可以等待,如下所示:

Task<int> task = Task.Factory.FromAsync(
    socket.BeginSend(buffer, offset, size, socketFlags, null, null), 
    socket.EndSend);

// Wait on the task.
task.Wait();

// Get the result.
// Note, you can omit the call to wait above, the call to 
// Result will block.
int bytesSent = task.Result;