2011-10-03 30 views

回答

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

可以爲用戶提供代碼的例子嗎? – RBZ

+0

@Kaizen:完成。請注意'StartTask'方法如何知道它是Windows窗體應用程序的事實 - 相同的代碼可以在WPF應用程序中工作。 –

+0

傑出!謝謝! – RBZ

0

根據您使用的應用程序,可能會有不同的方法。

  • 的WinForms:Control.Invoke
  • WPF/Silverlight中/ WP7及其衍生物:Dispatcher.Invoke
  • 一些其他類型的應用程序:定義什麼UI線程意味着第一?
相關問題