Мне интересно найти пробелы в решении для обработки цепочек асинхронных вызовов в silverlight. Пожалуйста, дайте мне знать, если вы найдете пробелы/проблемы в решении. В качестве альтернативы, если есть другой способ/шаблон для решения проблемы, пожалуйста, укажите мне в правильном направлении.отслеживание асинхронных вызовов
Код не компилируется или протестированы
Проблема
У нас есть требование, чтобы сделать какие-то действия после того, как куча асинхронных вызовов закончены.
Например, назначьте значения по умолчанию элементам управления пользовательским интерфейсом после завершения служебных вызовов.
void Fun()
{
Servicecall1();
Servicecall2();
//Make sure the following is executed only after the previous async calls are finished.
AssignDefaultValues();
}
Решение
Один из способов сделать это сцепление сервис звонков через обратные вызовы. Тем не менее, мне просто интересно, как плохо/хорошо он пытается достичь этого через объект специального асинхронного класса отслеживания выполнения, как показано ниже.
class SomeClass
{
AsyncMehodCallWatcher _methodcallwatcher = new AsyncMehodCallWatcher();
void fun()
{
_methodcallwatcher.AsyncMethodStartMultipleCall(() =>
{
//this function will be called automatically after the following service calls
AssignDefaultValues();
}, 2);
Servicecall1();
Servicecall2();
}
void Servicecall1()
{
serviceclient.DoSomething(DoSomethingcallback);
}
void DoSomethingcallback(object sender, GetCompletedEventArgs arg)
{
_methodcallwatcher.AsyncCallCompleted();
}
void Servicecall2()
{
serviceclient.DoSomething(DoSomething2callback);
}
void DoSomething2callback(object sender, GetCompletedEventArgs arg)
{
_methodcallwatcher.AsyncCallCompleted();
}
}
Любой, кому нужно позвонить Servicecall1(), или Servicecall2() должен вызвать AsyncMethodPreCall (нуль).
А вот предлагаемая реализация AsyncMehodCallWatcher
public class AsyncMehodCallWatcher
{
private int _counter = 0;
public AsyncMehodCallWatcher()
{
}
public void AsyncMethodPreCall()
{
AsyncMethodPreCall(null);
}
Action _callcompletedaction = null;
public void AsyncMethodStartMultipleCall(Action action, int numofcalls)
{
if (action != null)
{
if (_callcompletedaction != null)
{
throw new InvalidOperationException(LocalString.AsyncMehodCallWatcherErrorAsyncCalls);
}
_callcompletedaction = action;
_counter = numofcalls;
}
}
public void AsyncMethodPreCall(Action action)
{
if (action != null)
{
if (_callcompletedaction != null)
{
throw new InvalidOperationException(LocalString.AsyncMehodCallWatcherErrorAsyncCalls);
}
_callcompletedaction = action;
}
_counter++;
}
public void AsyncCallCompleted()
{
_counter--;
if (_counter < 0)
{
throw new InvalidOperationException(LocalString.AsyncMehodCallWatcherErrorAsyncCalls);
}
if (_counter == 0)
{
if (_callcompletedaction != null)
{
_callcompletedaction();
_callcompletedaction = null;
}
}
}
}
В чем вопрос – Sajeetharan
Для упомянутой проблемы предлагается приемлемое решение или любой другой способ? – Jimmy
Вы ориентируетесь на Silverlight
Noseratio