Я должен передать WaitHandle, который я создал, например, как параметр StateObject, в мой метод BeginReceiveFrom, чтобы я мог получить к нему доступ позже в методе обратного вызова. я отредактировал мой код, и теперь он работает. на самом деле, я думаю, что похожие образцы в интернете такие слабые и ужасные.
...
EventWaitHandle auto = new EventWaitHandle(false, EventResetMode.ManualReset);
auto.Reset();
mySocket.BeginReceiveFrom(arrData, 0, 4, SocketFlags.None, ref EP, new AsyncCallback(ReceiveCallback), auto);
if (auto.WaitOne(10000, false))
{
_log.AppendLine("Message lenght receive success");
}
...
и
void ReceiveCallback(IAsyncResult ar)
{
bool b = ((EventWaitHandle)ar.AsyncState).Set();
_log.AppendLine(string.Format("AsyncWaitHandle.Set() called and returned {0}",b));
}