Основной поток WPF не блокируется методом WaitOne при поступлении события Windows.DeactivateC#

Место общения программистов C#
Ответить
Anonymous
 Основной поток WPF не блокируется методом WaitOne при поступлении события Windows.Deactivate

Сообщение Anonymous »

У меня очень странная проблема с моим приложением WPF.
Когда в основном потоке вызывается метод AutoResetEvent.WaitOne(), окно теряет фокус и Windows.Deactivate вызывается метод, функция-обработчик выполняется, даже если она вызывается и в основном потоке.
Пример кода проблемы:

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

private AutoResetEvent m_autoResetEvent;

public MainWindow()
{
InitializeComponent();
m_autoResetEvent = new AutoResetEvent(false);
}

private void Window_Deactivated(object sender, EventArgs e)
{
}

private void test_Click(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000000);
m_autoResetEvent.Set();
});

m_autoResetEvent.WaitOne();
}
При нажатии кнопки основной поток останавливается в WaitOne(), но когда окно теряет фокус, метод Window_Deactivated() также вызывается из основного потока.
Я думаю, причина может быть чем-то похожа на ту, что описана здесь:
https://learn.microsoft.com/en-us/dotne ... nd-locking
но это относится к блокировке и общим «оконным сообщениям Win32»...
Другое дело, что это происходит только с событиями Windows.Activate и Windows.Deactivate, а не с событиями Windows.Activate и Windows.Deactivate. другие события окна.
Знаете ли вы, имеют ли эти события особый приоритет перед другими и/или существуют ли другие подобные события?

Подробнее здесь: https://stackoverflow.com/questions/792 ... event-arri
Ответить

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

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

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

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

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