Как вызвать основной поток пользовательского интерфейса из службы - PullRequest
4 голосов
/ 12 августа 2011

У меня есть класс Service, которому Action<> CallBack отправляют клиенты.

Как мне вызвать службу Action<> CallBack в потоке основного пользовательского интерфейса, чтобы клиенты получали CallBack наПользовательский интерфейсСлужба ничего не знает о WinForms (на самом деле она запускает приложение для Android с использованием MonoDroid)

Ответы [ 2 ]

1 голос
/ 13 августа 2011

Обычно лучше оставить код Winforms для обработки потоков. Если вы хотите помочь, рассмотрите шаблон, используемый System.Timers.Timer и FileSystemWatcher, у них есть свойство SynchronizingObject, которое код Winforms может установить для получения событий, возникающих в потоке пользовательского интерфейса. Сделайте так, чтобы это выглядело примерно так:

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 голосов
/ 13 августа 2011

Предполагая, что вы делаете что-нибудь , которое пересекает домен приложения (WCF, Remoting), вы не должны передавать делегат в качестве обратного вызова, он просто не будет работать.

Вместо этого вы должны определить контракты, которые клиент реализует и передает службе (WCF имеет контракты обратного вызова ), а затем служба вызывает обратный вызов.

При вызове клиентская реализация обратного вызова будет запущена. В реализации клиент вносит изменения в пользовательский интерфейс. Обратите внимание, что большинство обратных вызовов, которые поступают через вызовы внутри домена приложения, не находятся в потоке, который вызывал их по умолчанию; Обязательно внесите изменения в пользовательский интерфейс, перенаправив вызов в поток пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...