多个线程调用WCF服务
问题描述:
下面是我简单的代码来启动5个线程,每一个调用返回发送的值WCF服务,我的问题是:多个线程调用WCF服务
public void clien_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
lock (sync)
{
count += e.Result;
}
}
工作正常,并增加计数器,但我如何捕获所有线程完成时,有没有人有简单的示例代码如何调用多个使用异步方法的wcf服务。
public partial class Threading : Form
{
public int count;
ServiceReference1.Service1Client clien = new ServiceReference1.Service1Client();
public Threading()
{
InitializeComponent();
}
private void GetData()
{
clien.GetDataAsync(1);
}
public void DisplayResults()
{
MessageBox.Show(count.ToString());
}
private object sync = new object();
public void clien_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
lock (sync)
{
count += e.Result;
}
}
public List<Thread> RunThreads(int count, ThreadStart start)
{
List<Thread> list = new List<Thread>();
for (int i = 0; i <= count - 1; i++)
{
dynamic thread = new Thread(start);
thread.Start();
list.Add(thread);
}
return list;
}
private void button1_Click_1(object sender, EventArgs e)
{
clien.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(clien_GetDataCompleted);
ThreadStart WcfCall = new ThreadStart(GetData);
IList<Thread> threads = RunThreads(5, WcfCall);
}
}
千恩万谢
答
如果您使用的是.NET 4.0中,您可以使用任务并行库(TPL)和使用任务,而不是主题。任务有更多的流量控制。你可以用任务做的东西像
// Wait for all the tasks to finish.
Task.WaitAll(tasks);
这里例如如何使用任务,等待所有任务完成。 here
答
我已经实现了使用任务的解决方案,代码如下,其作品很好,让我知道如果我能做的任何改进。
public partial class Tasks : Form
{
static ServiceReference1.Service1Client clien = new ServiceReference1.Service1Client();
int count = 0;
public Tasks()
{
InitializeComponent();
}
// Define a delegate that prints and returns the system tick count
Func<object, int> action = (object obj) =>
{
int i = (int)obj;
clien.GetDataAsync(i);
Console.WriteLine("Task={0}, i={1}, Thread={2}", Task.CurrentId, i, Thread.CurrentThread.ManagedThreadId);
return i;
};
public void clien_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
count += e.Result;
}
private void button1_Click(object sender, EventArgs e)
{
const int n = 5;
// create async callback delegate from wcf.
clien.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(clien_GetDataCompleted);
// Construct started tasks
Task<int>[] tasks = new Task<int>[n];
for (int i = 0; i < n; i++)
{
tasks[i] = Task<int>.Factory.StartNew(action, i);
}
try
{
// Wait for all the tasks to finish.
Task.WaitAll(tasks);
MessageBox.Show(count.ToString());
}
catch
{
}
}
}
欢呼
+0
看起来不错。我唯一要做的就是检查client_GetDataCompleted是否有错误。 if(e.Cancelled) return;如果(e.Error!= null) else e .Error; else count + = e.Result; – 2010-12-02 15:24:54
感谢弗拉德,我就给你一展身手。 – 2010-12-02 14:37:34