我需要在异步中调用多个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();
}
}
}
答案 0 :(得分:0)
您正在为GetDataCompleted事件订阅多次(5)次,每次调用一次,因此每次事件被触发时,您的处理程序将被调用5次(5x5 = 25)。可能想要移动这一行:
clien.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(clien_GetDataCompleted);
离开循环。