RBZ*_*RBZ 3 .net task-parallel-library
我正在使用TPL并且需要有一个长时间运行的TPL任务将结果发送到父UI线程而不会终止.我已经尝试了几种方法,并且一直在谷歌上搜索.有谁知道如何使用TPL实现这一目标?
您可以传入一个委托来调用定期结果,并且SynchronizationContext该任务可以用来在正确的线程上调用回调.这基本上就是这样BackgroundWorker做的方式(以及C#5的异步功能将"知道"在哪里给你回电) - 它SynchronizationContext.Current在调用线程上捕获,然后调用Post(IIRC)将消息发布到正确的上下文.然后你只需要将原始回调包装在一个SendOrPostCallback当它到达正确的线程时执行它.
编辑:示例程序:
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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)