без исходного кода, немного сложно угадать проблему, но я думаю, что проблема в том, что вы добавляете один и тот же завершенный обработчик несколько раз. Как это:
for(int i =0; i < 10; i++)
{
ws.callCompleted += CallCompletedHandler;
ws.callAsync(i);
}
void CallCompletedHandler(object sender, EventArgs args)
{
handle result
}
Вы удаляете обработчик в завершенном событии?
void CallCompletedHandler(object sender, EventArgs args)
{
ws.callCompleted -= CallCompletedHandler;
handle result
}
Это может решить вашу проблему.
Вот еще несколько идей:
Поскольку ваш вызов асинхронный, может случиться так, что завершенный обработчик вызывается до десяти раз для каждого вызова (потому что вы добавили его 10 раз). Вы можете использовать параметр UserState (http://msdn.microsoft.com/en-us/library/wewwczdw(v=vs.80).aspx)), чтобы вы могли сопоставить завершенный обработчик с вашим вызовом.
for(int i =0; i < 10; i++)
{
ws.callCompleted += CallCompletedHandler;
ws.callAsync(i, i); //Second param is user state
}
void CallCompletedHandler(object sender, EventArgs args)
{
if(args.UserState == //Your check here;)
{
ws.callCompleted -= CallCompletedHandler; //Remove the handler
handle result
}
}
Проблема здесь в том, что вам нужна какая-то переменная класса для отслеживания ваших пользовательских состояний.
Если вы напишите это так, вам не нужно это делать.
for(int i =0; i < 10; i++)
{
CallWebservice(i);
}
void CallWebservice(int i)
{
EventHandler myHandler= null;
myHandler = (s, args) => {
if(args.UserState == i){
ws.callCompleted -= myHandler; //Remiov
Handleresult
};
ws.callCompleted += myHandler; //Add the handler
ws.callAsync(i, i); //Call the ws
}
}
Если у вас есть дополнительные вопросы, просто оставьте комментарий. Если бы вы могли предоставить некоторый исходный код, я думаю, что мы можем помочь вам больше.
BR
TJ