我正在使用TPL,需要长时间运行的TPL任务将结果发送到父UI线程而不终止。我尝试了几种方法,并且一直在使用Google进行搜索。有谁知道如何使TPL发生这种情况?TPL任务如何将中间结果发送给父线程?
3
A
回答
5
您可以传入一个委托来调用定期结果和一个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);
}
});
}
}
0
根据您使用的应用程序,可能会有不同的方法。
- 的WinForms:Control.Invoke
- WPF/Silverlight中/ WP7及其衍生物:Dispatcher.Invoke
- 一些其他类型的应用程序:定义什么UI线程意味着第一?
相关问题
- 1. 如何在C#中获取TPL任务线程的引用?
- 2. 异步任务发送结果到GUI
- 3. 用于长时间运行的任务的线程池或TPL
- 4. 开发数据库服务器:如何将结果发送给客户端?
- 5. 如何发送和处理TService父线程和子线程之间的消息?
- 6. 如何将消息发送给父进程
- 7. TPL内任务
- 8. 将值发送给工作线程PyQt?
- 9. 如何更改php函数将结果发送给jquery ajax
- 10. 如何将PHP函数的结果发送给c#客户端?
- 11. 发送信号给线程
- 12. 如何将父任务的参数传递给Rake中的子任务?
- 13. 使用任务(TPL)库是否使应用程序多线程?
- 14. 发送jenkins将结果发送到Confluence
- 15. TPL中的最大任务?
- 16. TPL线程数
- 17. 线程/ TPL等
- 18. TPL Dataflow SendAsync结果
- 19. 在Phabricator中,如何将父项分配给现有任务,并将其从任务更改为子任务
- 20. Android:如何在服务中启动一个新的线程(并将结果发送回我的活动)?
- 21. 你如何在Ruby中的线程发送字符串回到父线程
- 22. 如何正确取消TPL任务(续)
- 23. $ _POST不给任何结果
- 24. 如何将结果从C#应用程序发送到Django Web服务?
- 25. ActionListener如何将过程的结果发送回JTextArea
- 26. Android:如何将数据从线程发送回服务?
- 27. 计划在UI线程vs UI上运行的TPL任务线程
- 28. 如何查看有多少线程正在完成我的任务TPL?
- 29. 如何将数据从HTML发送到python并将结果返回给HTML?
- 30. 如何存储在线程池中运行的任务的结果?
可以为用户提供代码的例子吗? – RBZ
@Kaizen:完成。请注意'StartTask'方法如何知道它是Windows窗体应用程序的事实 - 相同的代码可以在WPF应用程序中工作。 –
杰出!谢谢! – RBZ