Асинхронный сокет: заблокируйте этот поток перед отправкой всех данных
Относительно 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;