gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:55:40 29 4
gpt4 key购买 nike

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

最佳答案

您可以传入一个委托(delegate)以定期调用结果,以及一个 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);
}
});
}
}

关于.net - TPL 任务如何将中间结果发送到父线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7640479/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com