2014-11-11 2 views
1

Я много читал о потоках, но не могу понять, как правильно работать. Так оно и должно быть действительно очевидно, как это сделать, как это обычно бывает со мной (всегда отсутствует очевидное): рЖдите по потоку для активности пользовательского интерфейса

Вот моя проблема (кстати, я работаю с WPF в C#):

У меня есть длинный Я работаю на отдельном потоке, а пользовательский интерфейс остается в состоянии реакции и показывает эволюцию. Однако, в середине процесса, мне нужно попросить пользователя подтвердить значение перед продолжением. Это то, что я не могу понять, потому что окно, чтобы подтвердить, что значение должно быть запущено в потоке пользовательского интерфейса и все равно вернуть значение в рабочий поток, чтобы он мог продолжить работу.

Итак ...

Long running process beeing run in work thread 
Work thread waits for UI Thread 
    UI thread shows the confirmation window 
    User confirms/fixes value and closes the confirmation window 
    UI thread sends result from confirmation window to work thread 
work thread gets values from UI Thread (value was changed by user? to what?) 
work thread continues long running process 
Work thread gets values from confirmation window 

Я уже работа нить хорошо работает с использованием ThreadPool - хотя я открыт для использования многопоточности различными способами (NET 4.5). Проблема, с которой я сталкиваюсь, заключается в том, что если я отправлю часть окна подтверждения в диспетчер, то мой рабочий поток не будет ждать результатов из окна подтверждения. Если я не стану в диспетчере, я получаю исключение из-за того, что вы не сталкиваетесь с потоком STA при вызове конструктора окна.

Любые идеи приветствуются

+1

У вас есть две функции? Один, который запускает предварительный пользовательский ввод, и тот, который запускает пользовательский ввод? – BradleyDotNET

+0

Не будет ли пользовательский интерфейс зависеть, пока я жду, пока часть ввода для предварительного пользователя закончится? – 537mfb

+2

Нет, вы его вносите (как и сейчас). Пользователь вводится, когда поток завершается (используя обратный вызов или событие), а затем второй поток/функция запускается. – BradleyDotNET

ответ

1

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

Проще простого решения было бы разделить ваш процесс на два резьбы; который запускает предварительный пользовательский ввод, и тот, который выполняется после. Вы будете запрашивать пользователя после завершения первого потока (через обратный вызов или событие).

Нечто подобное (псевдо-код)

InitialThreadObject.Completed +=() => 
    { 
     PromptForUI(); 
     SecondThreadObject.Start(); 
    } 
InitialThreadObject.Start(); 

Очевидно, что вы выбрали бы механизм уведомления о завершении на основании текущего кода.

Смежные вопросы