TPL任务如何将中间结果发送到父线程?

时间:2011-10-03 20:50:52

标签: .net task-parallel-library

我正在使用TPL并且需要有一个长时间运行的TPL任务将结果发送到父UI线程而不会终止。我已经尝试了几种方法,并且一直在谷歌上搜索。有谁知道如何使用TPL实现这一目标?

2 个答案:

答案 0 :(得分:5)

您可以传入一个委托来调用定期结果,以及一个SynchronizationContext,该任务可以用来在正确的线程上调用回调。这基本上就是BackgroundWorker做它的方式(以及C#5的异步功能将“知道”在哪里给你回电) - 它在调用线程上捕获SynchronizationContext.Current,然后调用{{ 3}}(IIRC)将消息发布到正确的上下文中。然后,您只需将原始回调包装在Post中,当它到达正确的线程时执行它。

编辑:示例程序:

using System;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;

class Test
{
    static void Main()
    {
        Form form = new Form();
        Label label = new Label();
        form.Controls.Add(label);
        form.Load += delegate { HandleLoaded(label); };
        Application.Run(form);
    }

    static void HandleLoaded(Label label)
    {
        Action<string> callback = text => label.Text = text;
        StartTask(callback);
    }

    static void StartTask(Action<string> callback)
    {
        SendOrPostCallback postCallback = obj => callback((string) obj);
        SynchronizationContext context = SynchronizationContext.Current;

        Task.Factory.StartNew(() => {
            for (int i = 0; i < 100; i++)
            {
                string text = i.ToString();
                context.Post(postCallback, text);
                Thread.Sleep(100);
            }
        });
    }
}

答案 1 :(得分:0)

根据您使用的应用程序,可能会有不同的方法。