Синхронное / асинхронное решение может быть принято независимо на стороне сервера или клиента. Вызов EndWait на клиенте не переводится в вызов EndWait на сервере. Я бы порекомендовал протестировать асинхронную службу с клиентом синхронизации, чтобы упростить задачу и избежать путаницы.
Я бы также рекомендовал вам не вызывать WaitOne внутри метода EndWait. Контракт заключается в том, что этот метод будет вызываться только после того, как IAsyncResult сообщит платформе, что это сделано. Это делается одним из трех способов:
- CompletedSynchronically возвращает true
- Вызывается AsyncCallback
- AsyncWaitHandle сигнализируется
CompletedSynchronously должен возвращать true, только если BeginWait имел достаточно информации для завершения запроса до его возврата. Это, вероятно, не тот случай. Вы можете выполнить два других условия с помощью ManualResetEvent следующим образом:
class EventBasedAsyncResult : IAsyncResult
{
private readonly ManualResetEvent _manualResetEvent;
private readonly AsyncCallback _asyncCallback;
private readonly object _asyncState;
public EventBasedAsyncResult(AsyncCallback callback, object asyncState)
{
_manualResetEvent = new ManualResetEvent(false);
_asyncState = asyncState;
_asyncCallback = callback;
}
public void WaitCompleted()
{
_manualResetEvent.Set();
_asyncCallback(this);
}
public object AsyncState
{
get { return _asyncState; }
}
public WaitHandle AsyncWaitHandle
{
get { return _manualResetEvent; }
}
public bool CompletedSynchronously
{
get { return false; }
}
public bool IsCompleted
{
get { return _manualResetEvent.WaitOne(0); }
}
}
Я думаю, что как только вы это сделаете, вы обнаружите, что EndWait вызывается, даже если клиент синхронен.