2011-08-12 32 views
4

我有一個服務類,其客戶端發送給它的Action<> CallBack如何從服務調用主UI線程

如何在主UI線程上調用Action<> CallBack服務,以便客戶端在UI線程上獲得CallBack。該服務知道的WinForms什麼(它實際上是運行使用MonoDroid的一個Android應用)

+0

你的問題不是很清楚。該服務如何與WinForms進行通信? –

+0

當你說「服務」時,你在說什麼*具體*? –

回答

1

通常最好將其留給Winforms代碼來處理線程。如果你想幫忙,然後考慮System.Timers.Timer和FileSystemWatcher使用的模式,他們有一個SynchronizingObject屬性,Winforms代碼可以設置該屬性來獲取在UI線程上引發的事件。使其看起來類似於:

using System; 
using System.ComponentModel; 

class Service { 
    public Action Callback { get; set; } 
    public ISynchronizeInvoke SynchronizationObject { get; set; } 

    public void DoWork() { 
     //... 
     var cb = Callback; 
     if (cb != null) { 
      if (SynchronizationObject == null) cb(); 
      else SynchronizationObject.BeginInvoke(cb, null); 
     } 
    } 
} 
0

假設你正在做任何跨越應用程序域(WCF,Remoting的),你不應該傳遞一個委託作爲回調,它根本無法工作。

相反,您必須定義客戶端實現並傳遞給服務的合同(WCF有callback contracts),然後服務將調用回調。

當被調用時,客戶端的回調實現將被觸發。它在客戶端對UI做出更改的實現。請注意,通過intra-app-domain調用進行的大多數回調不在默認調用它們的線程上;請確保通過編組對UI線程的調用來執行UI更改。

相關問題