将多个异步调用线程化到WCF服务

时间:2010-11-26 15:56:35

标签: multithreading wcf model-view-controller

我需要在异步中调用多个Wcf服务,目前我正在改变它们并且速度太慢,我需要立即调用它们然后将完整的数据放入BO中。

我在下面有下面的代码,它在完成时调用相同的方法,但正如你所看到的那样,调用相同方法的线程存在问题,当它应该只有5时,它调用方法25次。

在之前的例子中,它显示了一个sepe

你能告诉我如何锁定方法,这样一次只有一个线程可以使用它,在我的类中使用BackgroundWorkerProcess是否有效,这是MVC 2应用程序的一部分?

namespace WCFThreadingTest

{     公共部分类Form1:表格     {         public static int result = 0;

    public Form1()
    {
        InitializeComponent();
        Completed += (s, a) =>
        {
            // all complete, return to client.
            MessageBox.Show(result.ToString());
            auto.Close();
            wrk.Dispose();
        };

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

        wrk.RunWorkerAsync();
    }

    public event EventHandler Completed;
    public AutoResetEvent auto = new AutoResetEvent(false);

    private void Start()
    {
        auto.WaitOne();
        Completed(this, EventArgs.Empty);
    }

    BackgroundWorker wrk = new BackgroundWorker();

    private void button1_Click(object sender, EventArgs e)
    {
        ServiceReference1.Service1Client clien = new ServiceReference1.Service1Client();

        for (int i = 0; i < 5; i++)
        {
            clien.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(clien_GetDataCompleted);
            clien.GetDataAsync(i);
        }
    }

    public void clien_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
    {
            result += e.Result;
            auto.Set();
    }

}

}

1 个答案:

答案 0 :(得分:0)

您正在为GetDataCompleted事件订阅多次(5)次,每次调用一次,因此每次事件被触发时,您的处理程序将被调用5次(5x5 = 25)。可能想要移动这一行:

clien.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(clien_GetDataCompleted);

离开循环。