Взаимная блокировка, когда поток использует диспетчер, а основной поток ожидает завершения потока.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Взаимная блокировка, когда поток использует диспетчер, а основной поток ожидает завершения потока.

Сообщение Anonymous »

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

Код: Выделить всё

        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, поэтому поток должен иметь возможность использовать диспетчер.invoke(). Но в тот момент, когда я выполняю Dispatcher.Invoke, возникает взаимоблокировка, поскольку основной поток ожидает завершения вторичного потока, поскольку ему нужен результат.

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

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

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

Подробнее здесь: https://stackoverflow.com/questions/242 ... r-thread-t
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»