线程化多个异步调用

6 silverlight multithreading

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

现在,我知道那不是最好的方法(!).我一直在寻找AutoResetEvent(链接到MSDN示例)来进行线程化,然后同步结果,但似乎无法使其与异步服务调用一起使用.

有没有人有理由怀疑这种方法还是应该这样做?感谢代码示例!

Jar*_*das 7

看看这个例子:

一旦两个服务都返回,将触发完成事件并将"完成"打印到"调试输出".关键是等待AutoResetEvents发生在后台线程中.


public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        Completed += (s, a) => { Debug.WriteLine("done"); };

        wrk.DoWork += (s, a) =>
            {
                Start();
            };

        wrk.RunWorkerAsync();
    }
    public event EventHandler Completed;

    private void Start()
    {
        auto1.WaitOne();
        auto2.WaitOne();

        Completed(this, EventArgs.Empty);
    }

    public AutoResetEvent auto1 = new AutoResetEvent(false);
    public AutoResetEvent auto2 = new AutoResetEvent(false);

    BackgroundWorker wrk = new BackgroundWorker();

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ServiceReference1.Service1Client clien = new SilverlightAsyncTest.ServiceReference1.Service1Client();

        clien.DoWorkCompleted += new EventHandler<SilverlightAsyncTest.ServiceReference1.DoWorkCompletedEventArgs>(clien_DoWorkCompleted);
        clien.DoWork2Completed += new EventHandler<SilverlightAsyncTest.ServiceReference1.DoWork2CompletedEventArgs>(clien_DoWork2Completed);

        clien.DoWorkAsync();
        clien.DoWork2Async();
    }

    void clien_DoWork2Completed(object sender, SilverlightAsyncTest.ServiceReference1.DoWork2CompletedEventArgs e)
    {
        Debug.WriteLine("2");
        auto1.Set();
    }

    void clien_DoWorkCompleted(object sender, SilverlightAsyncTest.ServiceReference1.DoWorkCompletedEventArgs e)
    {
        Debug.WriteLine("1");
        auto2.Set();
    }
}
Run Code Online (Sandbox Code Playgroud)