Асинхронный сокет: заблокируйте этот поток перед отправкой всех данных

Относительно 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();

Это достаточно хорошо? Или есть ли лучшие альтернативы?

спасибо за ответ

1 ответ

Самый простой способ - это использовать Send метод на Socket класс, так как он блокирует вызывающий поток, вот так:

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;
Другие вопросы по тегам