В моем приложении есть следующий код.
MyEventHandler handler = null; //Declare the handler
foreach (string pname in group)
{
handler = getHandler(pname); //Get the handler
if(handler == null)
{
throw new KeyNotFoundException("No user " + pname + " could be found");
}
//invoke the handler
handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
}
Итак, я получаю обработчик и вызываю BeginInvoke
метод. Но перед вызовом BeginInvoke
он переходит к следующей итерации и значение обработчика изменяется. Так что BeginInvoke
подключается к этому новому обработчику.
Надеюсь, вы поняли мою точку зрения. Итак, как я могу устранить эту проблему? Я не хочу звонить спать после BeginInvoke
, так как чувствую, что это потеря времени.
Есть идеи?
Update1
Я уверен, что объект обработчика изменяется перед вызовом BeginInvoke (). Я предполагаю, что BeginInvoke требуется некоторое время для создания отдельного потока для вызова другой функции.
Update2
Этот код находится в службе WCF, и клиенты вызывают функцию, которая, в свою очередь, использует эту функцию. У меня на сервере хранятся отдельные обработчики для каждого клиента. Служба WCF имеет дуплексный контракт с разделением сеансов для клиента. Я вижу, что после выполнения этой функции один и тот же пользователь вызывается дважды. Но я ставлю точку останова и отлаживаю ее (что дает BeginInvoke необходимое время для вызова функции), она работает «ОТЛИЧНО». Я очень уверен, что столкнулся с этой проблемой в потоке тоже, где я создаю несколько потоков в цикле. Если делегат потока имеет параметры a, b, c и если вы изменяете его в начале следующей итерации, происходит то же самое поведение. Я не знаю, как многие из вас сталкивались с этой проблемой раньше. Если я поставлю Sleep () или сделаю копию обработчика и вызову его с помощью copy, он будет работать.
Update3
Хорошо, я проверил это сейчас. Я просто добавил Thread.Sleep () следующим образом.
chatTo.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
Thread.Sleep(500);
и он работает как шарм. Есть мысли?
Обновление 4
Я создал образец потока, демонстрирующий проблему, и Я загрузил его сюда . Я надеюсь, что решение этой проблемы решит и мою проблему. Пожалуйста, проверьте образец.