Я пишу приложение в WPF. У меня есть один основной поток, а другой - где я что-то вычисляю. В основном потоке мне нужно сделать одну операцию после завершения дополнительного потока. Я не могу использовать Join для дополнительного потока, потому что я не хочу блокировать основной поток. Как я могу дождаться окончания второго потока и в то же время не блокировать основной поток?Проблема с потоками в WPF
2
A
ответ
3
Самый простой способ - использовать backgroundworker и обработать событие RunWorkerCompleted.
Я также приглашаю вас посмотреть часть 3 Threading in C# pdf
2
Другой простой способ Джозефа Albahari заключается в использовании Task Parallel Library и цепи несколько задач с continuations.
Хотя это не освобождает вас от совета @ Конрада: Прочитайте the threading book. Это увлекательно и полностью стоит усилий.
+0
@ Аньванка +1 продолжение - очень хорошая альтернатива –
0
Если вы создаете свои собственные темы, есть рабочий поток вызывает метод обратного вызова, когда это делается:
public delegate void DoneDelegate (object calculationResults);
public class MyWorker
{
public DoneDelegate Done { get; set; }
public void Go()
{
object results = null;
// do some work
Done(results);
}
}
public class Main
{
public void StartWorker()
{
MyWorker worker = new MyWorker();
worker.Done = new DoneDelegate(DoneCallback);
System.Threading.Thread thread = new System.Threading.Thread(worker.Go);
thread.IsBackground = true;
thread.Start();
}
public void DoneCallback (object results)
{
// use the results
}
}
Смежные вопросы
- 1. Проблема с потоками Delphi
- 2. Странная проблема с потоками
- 3. Проблема с неподходящими потоками
- 4. Проблема с потоками
- 5. Простая проблема с потоками
- 6. Проблема с потоками Android
- 7. проблема с потоками (EXC_BAD_ACCESS)
- 8. Проблема с потоками Java?
- 9. проблема с потоками
- 10. Проблема с потоками Posix
- 11. Проблема с потоками
- 12. Проблема с потоками в C
- 13. Основная проблема с потоками Java
- 14. Асинхронная сеть + проблема с потоками
- 15. Проблема с таймерами и потоками
- 16. проблема с перекрестными потоками? C#
- 17. Проблема с анонимными потоками многопоточность
- 18. Проблема управления потоками!
- 19. Проблема с потоками в приложении iOS
- 20. Проблема с случайными и потоками в .NET
- 21. проблема с несколькими потоками в Python
- 22. Проблема с надувными потоками в периодической обработке
- 23. проблема с потоками в цикле while
- 24. Проблема с несколькими потоками - Передача объектов между потоками
- 25. Проблема с рабочими потоками с postMessage()
- 26. Простая проблема с потоками с услугой Windows
- 27. Проблема с несколькими потоками Android SQLite
- 28. Проблема NHIbernateIntegration ISessionManager с потоками IIS
- 29. Silverlight DataBinding проблема с перекрестными потоками
- 30. Проблема с java потоками объектов через сокеты
Ммм, я думаю, что это не будет лучшим решением. Я хотел бы отменить этот дополнительный поток, когда я нажимаю кнопку отмены. Я знаю, что у фонового работника есть метод CancelAsync(), но метод, который должен выполняться в фоновом работнике, работает независимо. Я имею в виду в этой функции у меня нет петли, которую я мог бы сломать, но я просто вызываю системную функцию для оптимизации, и я не могу ее сломать. – ravenik
@ravenik. У вас нет этой проблемы, независимо от того, какое решение вы выберете? Это 'if (_bw.CancellationPending) {e.Cancel = true; вернуть; } 'перед установкой' e.result' достаточно для вас? –