【问题标题】:Passing messages from child task to parent in c#在c#中将消息从子任务传递给父任务
【发布时间】:2013-10-07 17:36:03
【问题描述】:

我有一个会产生多个任务的 wcf 服务。我正在为每个任务寻找一种将信息提供回父线程(并最终通过数据合同提供给客户端)的方法

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

        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# 中找到等效的方法。

【问题讨论】:

    标签: c# multithreading wcf task


    【解决方案1】:

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

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

    同样的技术也应该适用于 C#。 C# 支持具有与 VB.Net 相同的基本功能集的委托和事件,因此如果您愿意,应该能够直接移植此代码。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        代表的定义

        /// <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);
        

        【讨论】:

        • 使用委托时,您几乎不需要定义自己的委托。您几乎可以始终使用系统定义的委托之一,通常是 ActionFunc
        • 同意,但是在您可以使用系统定义的代表之前,您必须了解如何创建自己的代表以及它们如何工作,然后才能开始使用快捷方式。
        • 这是为什么呢?您几乎不需要定义自己的委托;您几乎总是可以使用系统委托来代替。如果/当您发现自己处于需要创建自己的罕见情况时,查找方法很简单。我不认为知道如何将委托定义为真正有助于您理解委托是什么的语法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多