Тупик, когда поток использует диспетчер, а основной поток ожидает завершения потока

Может кто-нибудь объяснить, почему это создает тупик, и как его решить?

        txtLog.AppendText("We are starting the thread" + Environment.NewLine);

        var th = new Thread(() =>
        {

            Application.Current.Dispatcher.Invoke(new Action(() => // causes deadlock
            {
                txtLog.AppendText("We are inside the thread" + Environment.NewLine); // never gets printed
                // compute some result...
            }));


        });

        th.Start();
        th.Join(); // causes deadlock
        // ... retrieve the result computed by the thread

объяснениеМне нужен мой вторичный поток, чтобы вычислить результат и вернуть его в основной поток. Но вторичный поток также должен записывать отладочную информацию в журнал; а журнал находится в окне wpf, поэтому поток должен иметь возможность использовать dispatcher.invoke (). Но в тот момент, когда я выполняю Dispatcher.Invoke, возникает тупик, потому что основной поток ожидает завершения вторичного потока, потому что ему нужен результат.

Мне нужен шаблон, чтобы решить это. Пожалуйста, помогите мне переписать этот код. (Пожалуйста, напишите реальный код, а не просто говорите «используйте BeginInvoke»). Спасибо.

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

А тупиковая ситуация обычно решается путем наложения правила, согласно которому потоки могут блокировать только ресурсыв точном порядке, Я сделал это уже в другом месте. Но как я могу навязать это правило в этом случае, так как я не понимаю, каковы фактические ресурсы?

Ответы на вопрос(5)

Ваш ответ на вопрос