2013-10-07 30 views
1

我有一个wcf服务,将产生多个任务。我正在寻找一种方法来将信息提供给父线程(并最终通过数据合同向客户端提供信息)将消息从子任务传递给父c#

要完成的工作在单独的类中。在主类,我开始我的任务是这样的:

 CancellationTokenSource tokenSource = new CancellationTokenSource(); 
     CancellationToken token = tokenSource.Token; 
     Task[] arrTask = new Task[lstTasks.Count]; 
     int i = 0; 

     foreach(LabParser classA in lstTasks) 
      { 
       try 
       { 
        var t = Task.Factory.StartNew(clsa.ProcessLabs,token); 
        arrTask[i] = t; 
        i++; 
       } 
       catch (Exception e) 
       { 
        string tmp = e.ToString(); 
       } 
      } 
      Task.WaitAll(arrTask); 

所以在classA.ProcessLabs我要去了不少工作。我希望能够向这位家长发送一条消息,提供一些关于线程当前状态的信息。 我习惯于在vb中使用委托和事件并引发事件。 我似乎无法找到在C#中执行此操作的等效方法。

回答

0

您应该使用Task<T>,它允许回调返回一个值。

2

报告状态/进度的标准方法是通过IProgress<T>界面,通常通过默认的Progress<T>实施。

我习惯于在vb中使用委托和事件并引发一个事件。我似乎无法找到在c#中执行此操作的等效方法。

同样的技术也应该在C#中工作。 C#支持与VB.Net具有相同基本功能的代理和事件,因此,如果您愿意,您应该可以直接移植此代码。

0

使用委托和事件将在C#中工作,与VB相比,语法会有所不同。

Defenition委托

/// <summary> 
/// Update count delegate handler 
/// </summary> 
/// <param name="sender">Obect sender</param> 
/// <param name="ca">Event arguments</param> 
public delegate void UpdateCountHandler(object sender, TaskArgs ca); 

/// <summary> 
/// Update count event 
/// </summary> 
public event UpdateCountHandler UpdateCount; 

的要调用的事件。

// Call on the event 
this.UpdateCount(this, tsk); 
+0

使用委托时,几乎不需要定义自己的委托。您几乎总是可以使用系统定义的代表之一,通常是“Action”或“Func”。 – Servy

+0

同意,但在您可以使用系统定义的代表之前,您必须先了解如何创建他们自己以及他们的工作方式,然后才能开始使用捷径。 – Marko

+0

这是为什么?你几乎不需要定义你自己的代表;您几乎可以始终使用系统委托。如果/当你发现自己在极少数情况下需要创建自己的时候,它很简单,可以查看如何。我没有看到如何定义委托的语法,因为它可以帮助你理解委托是什么。 – Servy

相关问题