如何从服务调用主UI线程

时间:2011-08-12 19:49:06

标签: .net asynchronous callback

我有一个服务类,其客户端发送了Action<> CallBack

如何让服务调用主UI线程上的Action<> CallBack,以便客户端在UI线程上获取CallBack。该服务对WinForms一无所知(它实际上是使用MonoDroid运行Android应用程序)

2 个答案:

答案 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更改。