У меня есть следующая проблема: многопоточное приложение WPF, представление представления представления представления модели. Презентаторы и представления, которые принадлежат друг другу, создаются в отдельном потоке и получают отдельный диспетчер. Теперь кто-то вызывает из другого потока метод на презентаторе. Я перехватываю вызов, и теперь возникает проблема: если вызов поступает из того же потока, что и ведущий, я хочу продолжить вызов, иначе вызовите вызов Dispatcherthread, так что мне не нужно заботиться о Пользовательский интерфейс. Я уже читал об использовании SynchronizationContext, но, похоже, это не работает для меня, потому что если вызывающий поток не является потоком пользовательского интерфейса, я не могу сравнивать два контекста. Какое возможное, работающее и элегантное решение?Как передать вызов метода другому потоку?
1
A
ответ
3
if(presenterDispatcherObject.CheckAccess())
Doit();
else
presenterDispatcherObject.BeginInvoke(DispatcherPriority.Normal,() => DoIt());
0
Если вы хотите, чтобы вызов диспетчера блокировал (ожидание возврата), я бы использовал 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)
{
//...
}
Смежные вопросы
- 1. Назначение объекта другому потоку
- 2. Как передать значение от одного метода другому?
- 3. Как передать «само» значение метода другому методу?
- 4. Как передать значение из метода контроллера другому?
- 5. Как передать вызов preventDefault другому событию?
- 6. Как передать вызов веб-службы другому серверу?
- 7. Передать параметры метода другому методу внутри?
- 8. testng вызов параметризованного метода по другому методу
- 9. Вызов другого метода к другому классу
- 10. Swift - как передать тип через вызов метода?
- 11. Утилизация ресурсов ActiveX, принадлежащих другому потоку
- 12. WPF: Раскадровка объект цикла принадлежит другому потоку
- 13. Как передать определенное значение одному потоку?
- 14. Как передать значение от одного метода другому без использования возврата?
- 15. Как передать переменную от одного метода к другому в React
- 16. Как передать значение массива из метода другому методу в Laravel?
- 17. Как передать более 10 параметров от одного метода к другому
- 18. Как передать информацию о драйвере от одного метода другому
- 19. Как передать вывод одного метода другому в RSpec?
- 20. Как передать результат вызова статически импортированного общего метода другому методу?
- 21. Как передать значение от одного метода другому методу
- 22. Как передать класс моего параметра другому вызову метода?
- 23. android: как передать значение int другому из метода?
- 24. Доступ к данным по другому потоку
- 25. Чтение файла при добавлении к другому потоку
- 26. Как передать параметры потоку сборки Jenkins?
- 27. C++ 11 как передать данные текущему потоку
- 28. Передача метода другому методу
- 29. вызов ошибки доступа к потоку
- 30. JQuery вызов - передать идентификатор метода после одушевленного