2011-02-09 4 views
2

Я пишу приложение в WPF. У меня есть один основной поток, а другой - где я что-то вычисляю. В основном потоке мне нужно сделать одну операцию после завершения дополнительного потока. Я не могу использовать Join для дополнительного потока, потому что я не хочу блокировать основной поток. Как я могу дождаться окончания второго потока и в то же время не блокировать основной поток?Проблема с потоками в WPF

ответ

3

Самый простой способ - использовать backgroundworker и обработать событие RunWorkerCompleted.

Я также приглашаю вас посмотреть часть 3 Threading in C# pdf

+0

Ммм, я думаю, что это не будет лучшим решением. Я хотел бы отменить этот дополнительный поток, когда я нажимаю кнопку отмены. Я знаю, что у фонового работника есть метод CancelAsync(), но метод, который должен выполняться в фоновом работнике, работает независимо. Я имею в виду в этой функции у меня нет петли, которую я мог бы сломать, но я просто вызываю системную функцию для оптимизации, и я не могу ее сломать. – ravenik

+0

@ravenik. У вас нет этой проблемы, независимо от того, какое решение вы выберете? Это 'if (_bw.CancellationPending) {e.Cancel = true; вернуть; } 'перед установкой' e.result' достаточно для вас? –

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 
    } 
} 
Смежные вопросы