我正在使用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