问题描述
我有一些code如下:
I have some code as below:
foreach (var position in mAllPositions)
{
DoAsyncCall(position);
}
//I want to execute code here after each Async call has finished
那么,如何能做到上面?
我可以做这样的事情:
So how can I do the above?
I could do something like:
while (count < mAllPositions.Count)
{
//Run my code here
}
和每个异步调用后增量数由...但是这似乎并不像这样做的一个很好的方式。
and increment count after each Async call is made ... but this doesn't seem like a good way of doing it
有什么建议?有一些设计模式的上述问题,因为我敢肯定,这是一个常见的场景?
Any advice? Is there some design pattern for the above problem as i'm sure it's a common scenario?
推荐答案
假设你使用Silverlight和你没有获得信号量,你可能会寻找这样的事情(写在记事本,所以没有承诺以完美的语法):
Given that you're using Silverlight, and you don't have access to Semaphores, you might be looking for something like this (written in notepad, so no promises as to perfect syntax):
int completedCallCount = 0;
int targetCount = mAllPositions.Count;
using (ManualResetEvent manualResetEvent = new ManualResetEvent(false))
{
proxy.DoAsyncCallCompleted += (s, e) =>
{
if (Interlocked.Increment(ref completedCallCount) == targetCount)
{
manualResetEvent.Set();
}
};
foreach (var position in mAllPositions)
{
proxy.DoAsyncCall(position);
}
// This will wait until all the events have completed.
manualResetEvent.WaitOne();
}
然而,Silverlight的好处之一强迫你异步加载的数据是,你必须努力工作,做一个服务呼叫时锁定UI起来,这是你要什么做code这样的,除非你有在后台线程,我强烈建议你做的运行。直到后台进程完成您可以随时显示请稍候消息。
However, one of the benefits of Silverlight forcing you to asynchronously load data is that you have to work hard to lock the UI up when making a service calls, which is exactly what you're going to do with code like this, unless you have it running on a background thread, which I strongly recommend you do. You can always display a "please wait" message until the background process completes.
这篇关于Silverlight中,处理异步调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!