我有一个服务类,其客户端发送了Action<> CallBack
。
如何让服务调用主UI线程上的Action<> CallBack
,以便客户端在UI线程上获取CallBack。该服务对WinForms一无所知(它实际上是使用MonoDroid运行Android应用程序)
答案 0 :(得分:1)
通常最好将其留给Winforms代码来处理线程。如果您想要帮助然后考虑System.Timers.Timer和FileSystemWatcher使用的模式,它们具有SynchronizesObject属性,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);
}
}
}
答案 1 :(得分:0)
假设您正在执行跨越应用程序域(WCF,Remoting)的任何,您不应该将委托作为回调传递,它根本不起作用。
相反,您必须定义客户端实现并传递给服务的合同(WCF具有callback contracts),然后服务将调用回调。
调用时,将触发客户端的回调实现。在 实现中,客户端对UI进行了更改。注意,通过app-domain内调用发出的大多数回调都不在默认调用它们的线程上;确保通过封送对UI线程的调用来执行UI更改。