Как делегировать вызов метода другому потоку? - PullRequest
1 голос
/ 04 декабря 2008

У меня следующая проблема: многопоточное приложение WPF, реализация Model View Presenter. Представители и представления, которые принадлежат друг другу, создаются в отдельном потоке и получают отдельный диспетчер. Теперь кто-то вызывает из другого потока метод на Presenter. Я перехватываю вызов, и теперь начинается проблема: если вызов поступает из того же потока, что и докладчик, я хочу продолжить вызов, иначе вызовите вызов в Dispatcherthread, так что мне не нужно заботиться о Пользовательский интерфейс звонков. Я уже читал об использовании SynchronizationContext, но это, кажется, не работает для меня, потому что, если вызывающий поток не является потоком пользовательского интерфейса, я не могу сравнить 2 контекста. Какое возможное, рабочее и элегантное решение?

Ответы [ 2 ]

3 голосов
/ 04 декабря 2008
if( presenterDispatcherObject.CheckAccess() )
   Doit();
else
  presenterDispatcherObject.BeginInvoke( DispatcherPriority.Normal, () => DoIt() ); 
0 голосов
/ 05 декабря 2008

Если вы хотите, чтобы вызов Dispatcher блокировался (ожидание возврата), я бы использовал Invoke вместо BeginInvoke. Это имитировало бы больше поведения фактического вызова функции напрямую. Вызывать блокирование вызывающего потока до тех пор, пока функция не будет завершена (больше похоже на Win32 SendMessage). BeginInvoke просто отправляет сообщения и возвращает их, не дожидаясь возврата функции (как сообщение Win32 PostMessage).

CheckAccess идет медленно. Я бы ограничил CheckAccess, сделав звонки менее разговорчивыми в разных темах.

public delegate bool MyFuncHandler(object arg);

bool ThreadedMyFunc(object arg)
{
    //...

    bool result;

    //...

    // use dispatcher passed in,  I would pass into the contructor of your class
    if (dispatcher.CheckAccess())
    {
        result = MyFunc(arg);
    }
    else
    {
        result = dispatcher.Invoke(new MyFuncHandler(MyFunc), arg);
    }

    return result;
}

bool MyFunc(object arg)
{
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...