Ваш вопрос немного неясен (это должно быть count <=
?), Но здесь идет речь ...
То, что вы спрашиваете, это как сделать синхронный звонок.При асинхронном вызове, прежде чем сделать вызов, вы назначаете обработчик события, который будет вызван после завершения вызова, затем вы делаете вызов.Это означает, что ваш код завершения находится в функции, отличной от кода, который выполняет вызов.Это означает, что если ваш асинхронный вызов выполняется в потоке пользовательского интерфейса, пользовательский интерфейс не будет блокироваться во время вызова.
Синхронные вызовы возможны в Silverlight, но вы должны убедиться, что вы их не выполняетепоток пользовательского интерфейса.Один из способов добиться этого - запустить новый фоновый поток, выполнить асинхронный вызов в фоновом потоке, но заблокировать возврат, пока вызов не будет завершен.Вот пример псевдокода:
private AutoResetEvent myResetEvent;
private void MyCallFunction(object someParameter) {
if (this.Dispatcher.CheckAccess())
{
Action<object> a = new Action<object>(MyCallFunction);
a.BeginInvoke(someParameter, null, null);
return;
}
myResetEvent = new AutoresetEvent();
myAsyncCall.CallCompleted += new EventHandler<>(myAsyncCall_CallCompleted);
myAsyncCall.DoAsyncCall(someParameter);
myResetEvent.WaitOne();
//increment your count here
}
private void myAsyncCall_CallCompleted(object sender, SomeEventArgs e) {
if (e.Error == null && !e.Cancelled) {
if (myResetEvent != null)
myResetEvent.Set();
}
}
Обратите внимание, что этот код не особо ориентирован на многопоточность или готов к работе - это всего лишь быстрый пример.
Что происходитздесь, когда вы вводите MyCallFunction
, он проверяет, запущен ли он в потоке пользовательского интерфейса, если это так, то он повторно вызывает себя в фоновом потоке.Затем он устанавливает AutoResetEvent и выполняет асинхронный вызов.Затем он приостанавливает работу объекта myResetEvent
до тех пор, пока он не будет установлен (или «сигнализирован») из обработчика завершения вызова, после чего выполнение кода точки продолжается.Обратите внимание, что вы не должны пытаться получить доступ к элементу управления непосредственно из кода, подобного этому, без предварительного подтверждения того, что вы снова в потоке пользовательского интерфейса.
Когда я начал работать над тем, как это сделать в Silverlight, я начал с это ТАК сообщение , и продолжено с этой ссылкой .Но, как говорит Марк Гравелл в этом первом посте, не делайте этого, если сможете избежать этого.Единственный раз, когда мне нужно было это сделать, - это когда мне нужно было объединить результаты нескольких разрозненных вызовов WCF в один результат, который был возвращен в пользовательский интерфейс (и эти вызовы не могли быть объединены в один метод WCF в стиле фасада).