Multithreading 线程化多个异步调用

Multithreading 线程化多个异步调用,multithreading,silverlight,Multithreading,Silverlight,Silverlight应用程序的一部分需要来自三个服务请求的数据。到目前为止,我一直在链接请求,以便一个完成另一个启动。。。直到链的末端,我对数据做我需要做的事情 现在,我知道这不是最好的方法。我一直在研究(链接到MSDN示例)线程,然后同步结果,但似乎无法将其用于异步服务调用 有没有人有任何理由怀疑这种方法,或者这种方法是否有效?代码样本收到 看看这个例子: 一旦两个服务返回,将触发已完成事件并打印“完成”以调试输出。 关键的是,等待自动resetEvents发生在后台线程中 public部

Silverlight应用程序的一部分需要来自三个服务请求的数据。到目前为止,我一直在链接请求,以便一个完成另一个启动。。。直到链的末端,我对数据做我需要做的事情

现在,我知道这不是最好的方法。我一直在研究(链接到MSDN示例)线程,然后同步结果,但似乎无法将其用于异步服务调用


有没有人有任何理由怀疑这种方法,或者这种方法是否有效?代码样本收到

看看这个例子:

一旦两个服务返回,将触发已完成事件并打印“完成”以调试输出。 关键的是,等待自动resetEvents发生在后台线程中


public部分类主页面:UserControl
{
公共主页()
{
初始化组件();
已完成+=(s,a)=>{Debug.WriteLine(“完成”);};
工作时间+=(s,a)=>
{
Start();
};
wrk.RunWorkerAsync();
}
公共事件事件处理程序已完成;
私有void Start()
{
auto1.WaitOne();
auto2.WaitOne();
已完成(此,EventArgs.Empty);
}
public AutoResetEvent auto1=新的AutoResetEvent(false);
public AutoResetEvent auto2=新的AutoResetEvent(false);
BackgroundWorker wrk=新的BackgroundWorker();
私有无效按钮\u单击(对象发送者,路由目标e)
{
ServiceReference1.Service1Client clien=新的SilverlightAsyncTest.ServiceReference1.Service1Client();
clien.DoWorkCompleted+=新事件处理程序(clien\u DoWorkCompleted);
clien.DoWork2Completed+=新事件处理程序(clien\u DoWork2Completed);
clien.doworksync();
clien.DoWork2Async();
}
void clien_DoWork2Completed(对象发送方,SilverlightAsyncTest.ServiceReference1.DoWork2CompletedEventArgs e)
{
Debug.WriteLine(“2”);
auto1.Set();
}
void clien_DoWorkCompleted(对象发送方,SilverlightAsyncTest.ServiceReference1.DoWorkCompletedEventArgs e)
{
Debug.WriteLine(“1”);
auto2.Set();
}
}

可以使用每个异步方法返回的IAsyncResult中的WaitHandle来完成

代码很简单。在Silverlight中,我只做了10次服务调用,将一个项目添加到列表框中。我将等到所有服务调用结束后再向列表中添加另一条消息(这必须在不同的线程中运行,以避免阻塞UI)。还要注意,向列表中添加项目必须通过Dispatcher完成,因为它们将修改UI。有很多lamda,但很容易理解

 public MainPage()
        {
            InitializeComponent();
            var results = new ObservableCollection<string>();
            var asyncResults = new List<IAsyncResult>();
            resultsList.ItemsSource = results;
            var service = new Service1Client() as Service1;

            1.To(10).Do(i=>
                asyncResults.Add(service.BeginDoWork(ar =>
                    Dispatcher.BeginInvoke(() => results.Add(String.Format("Call {0} finished: {1}", i, service.EndDoWork(ar)))),
                    null))
            );

            new Thread(()=>
            {
                asyncResults.ForEach(a => a.AsyncWaitHandle.WaitOne());
                Dispatcher.BeginInvoke(() => results.Add("Everything finished"));
            }).Start();
        }

问题。您已为DoWork2设置了auto1。如果您有3个异步调用。您是否只需添加auto3并将其设置为DoWork3Completed事件?
 public MainPage()
        {
            InitializeComponent();
            var results = new ObservableCollection<string>();
            var asyncResults = new List<IAsyncResult>();
            resultsList.ItemsSource = results;
            var service = new Service1Client() as Service1;

            1.To(10).Do(i=>
                asyncResults.Add(service.BeginDoWork(ar =>
                    Dispatcher.BeginInvoke(() => results.Add(String.Format("Call {0} finished: {1}", i, service.EndDoWork(ar)))),
                    null))
            );

            new Thread(()=>
            {
                asyncResults.ForEach(a => a.AsyncWaitHandle.WaitOne());
                Dispatcher.BeginInvoke(() => results.Add("Everything finished"));
            }).Start();
        }
public class Service1
    {
        private const int maxMilliSecs = 500;
        private const int minMillisSecs = 100;
        [OperationContract]
        public int DoWork()
        {
            int millisSecsToWait = new Random().Next(maxMilliSecs - minMillisSecs) + minMillisSecs;
            Thread.Sleep(millisSecsToWait);
            return millisSecsToWait;
        }
    }