0

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

随着使用Socket.BeginSend

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

我在缓冲区参数内发送数据。我想知道是否有可能在所有数据真正从这里发送之前以某种方式阻塞线程(不考虑另一端是否收到数据)?所以我可以调用一个Socket.BeginReceive方法?

--

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

例子:

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

这够好吗?或者有没有更好的替代方案?

谢谢ans

4

1 回答 1

0

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

byte[] buffer = ...;

int bytesSent = socket.Send(bytes);

请注意,如果您真的想阻止对 BeginSend 的调用,您可以使用 Task Parallel Library 创建一个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;
于 2012-10-25T21:12:54.737 回答