Я много читал о потоках, но не могу понять, как правильно работать. Так оно и должно быть действительно очевидно, как это сделать, как это обычно бывает со мной (всегда отсутствует очевидное): рЖдите по потоку для активности пользовательского интерфейса
Вот моя проблема (кстати, я работаю с 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 при вызове конструктора окна.
Любые идеи приветствуются
У вас есть две функции? Один, который запускает предварительный пользовательский ввод, и тот, который запускает пользовательский ввод? – BradleyDotNET
Не будет ли пользовательский интерфейс зависеть, пока я жду, пока часть ввода для предварительного пользователя закончится? – 537mfb
Нет, вы его вносите (как и сейчас). Пользователь вводится, когда поток завершается (используя обратный вызов или событие), а затем второй поток/функция запускается. – BradleyDotNET