【问题标题】:How to Call the Main UI Thread from a Service如何从服务调用主 UI 线程
【发布时间】:2011-08-12 19:49:05
【问题描述】:

我有一个服务类,它的客户向它发送了一个Action<> CallBack

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

【问题讨论】:

  • 你的问题不是很清楚。该服务是如何与 WinForms 通信的?
  • 当你说“服务”时,具体你在说什么?

标签: .net asynchronous callback


【解决方案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);
        }
    }
}

【讨论】:

    【解决方案2】:

    假设您正在执行跨应用程序域(WCF、Remoting)的任何事情,您不应该将委托作为回调传递,它根本行不通。

    相反,您必须定义客户端实现并传递给服务的协定(WCF 有 callback contracts),然后服务将调用回调。

    调用时,会触发客户端的回调实现。 是客户端对 UI 进行更改的实现。请注意,大多数通过应用程序域内调用的回调默认情况下不在调用它们的线程上;确保通过编组对 UI 线程的调用来执行 UI 更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      相关资源
      最近更新 更多