我有一個服務類,其客戶端發送給它的Action<> CallBack
。如何從服務調用主UI線程
如何在主UI線程上調用Action<> CallBack
服務,以便客戶端在UI線程上獲得CallBack。該服務知道的WinForms什麼(它實際上是運行使用MonoDroid的一個Android應用)
我有一個服務類,其客戶端發送給它的Action<> CallBack
。如何從服務調用主UI線程
如何在主UI線程上調用Action<> CallBack
服務,以便客戶端在UI線程上獲得CallBack。該服務知道的WinForms什麼(它實際上是運行使用MonoDroid的一個Android應用)
通常最好將其留給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);
}
}
}
假設你正在做任何跨越應用程序域(WCF,Remoting的),你不應該傳遞一個委託作爲回調,它根本無法工作。
相反,您必須定義客戶端實現並傳遞給服務的合同(WCF有callback contracts),然後服務將調用回調。
當被調用時,客戶端的回調實現將被觸發。它在即客戶端對UI做出更改的實現。請注意,通過intra-app-domain調用進行的大多數回調不在默認調用它們的線程上;請確保通過編組對UI線程的調用來執行UI更改。
你的問題不是很清楚。該服務如何與WinForms進行通信? –
當你說「服務」時,你在說什麼*具體*? –