2010-12-02 105 views
1

下面是我简单的代码来启动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); 
     } 

    } 

千恩万谢

回答

0

如果您使用的是.NET 4.0中,您可以使用任务并行库(TPL)和使用任务,而不是主题。任务有更多的流量控制。你可以用任务做的东西像

// Wait for all the tasks to finish. 
    Task.WaitAll(tasks); 

这里例如如何使用任务,等待所有任务完成。 here

+0

感谢弗拉德,我就给你一展身手。 – 2010-12-02 14:37:34

0

我已经实现了使用任务的解决方案,代码如下,其作品很好,让我知道如果我能做的任何改进。

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