Я настраиваю сценарий клиента и сервера WCF, который должен быть надежным и масштабируемым, и как часть этого я пытаюсь сделать его многопоточным. По общему признанию у меня нет большого опыта многопоточности.
На клиенте обратный вызов с сервера (в данном случае «OnMessage») запускает событие на стороне клиента, которое должно передаваться в фоновом режиме. У меня есть CallbackBehavior ConcurrencyMode клиента, установленный в Single (по крайней мере, на данный момент). Поэтому, чтобы сделать ответ на обратный вызов, а не вызывать обработчик как обычно (либо обработчик (отправитель, eventargs или handler.Invoke ...), я вызываю handler.BeginInvoke.
Все работает нормально, но при обратном вызове я задаюсь вопросом, нужно ли мне явно вызывать EndInvoke или я в принципе ничего не могу сделать (вот мое отсутствие опыта многопоточности).
public void OnMessage(Message message)
{
EventHandler<MessageEventArgs> handler = OnServerMessage;
if (handler != null)
handler.BeginInvoke(this, new MessageEventArgs(message), CompleteHandler, handler);
}
public void CompleteHandler(IAsyncResult result)
{
((EventHandler<MessageEventArgs>)result.AsyncState).EndInvoke(result);
}
Могу ли я заменить CompleteHandler прямой ссылкой на обработчик. EndInvoke, или пустой метод, или, может быть, я должен что-то еще сделать?
Кроме того, в данный момент подписчик события блокирует ожидание пользовательского ввода с консоли. Когда приложение будет завершено, оно либо заблокирует ожидание в базе данных, либо будет асинхронным снизу вверх (поэтому это может не потребоваться, но я все же хотел бы знать).