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のthx

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 に答える