Код: Выделить всё
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
Мне нужен шаблон для решения этой проблемы. Пожалуйста, помогите мне переписать этот код. (Пожалуйста, напишите реальный код, а не просто говорите «использовать BeginInvoke»). Спасибо.
Кроме того, теоретически я не понимаю одного: взаимоблокировка может произойти только тогда, когда два потока обращаются к двум общим ресурсам в разные заказы. Но каковы реальные ресурсы в этом случае? Одним из них является графический интерфейс. Но что такое другой? Я этого не вижу.
А тупиковая ситуация обычно решается введением правила, согласно которому потоки могут блокировать ресурсы только в точном порядке >. Я уже делал это в другом месте. Но как я могу навязать это правило в данном случае, если я не понимаю, каковы реальные ресурсы?
Подробнее здесь: https://stackoverflow.com/questions/242 ... r-thread-t