private void WaitForDriveToBecomeReady()
{
AutoResetEvent syncEvent = new AutoResetEvent(false); //set wait signal to use later
//dispatcher to be able to change stuff in xaml from within thread
Action action1 = new Action(delegate() { grdMain.Children.Add(notification); });
Action action2 = new Action(delegate() { grdMain.Children.Remove(notification); });
Thread restoreThread1 = new Thread(()=>{
grdMain.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, action1); //show a notification
Thread.Sleep(1500); //sleep a bit...
grdMain.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, action2); //hide a notification
syncEvent.Set(); //signal to continue at *.WaitOne()
});
restoreThread1.Start();
syncEvent.WaitOne(); //let main thread wait until *.Set(); is called
}
Приведенный выше код работает идеально, если вы закомментировать две grdMain.Dispatcher.Invoke (...) ;. Он также работает perfekt, если вы закомментируете * .Set(); и * .WaitOne(); Но ПОЧЕМУ? Мне нужны оба ^^. Я не понимаю ...C# AutoResetEvent WaitOne останавливали диспетчерский
Я думаю, вы поняли, что правильно. Проблема возникает только с этой диспетчерской линией, поэтому я думаю, потому что, используя основной поток, это ожидание в основном потоке становится несовместимым, не так ли? Извините, но это заняло у меня часы и сошло с ума ^^. – CodingYourLife
Способ думать о том, что Dispatcher.Invoke очень похож на ваш код события + поток (как в концепции, так и в реализации). Он останавливает работу над другим потоком, а затем ждет, чтобы этот поток установил событие, когда работа выполнена. Поэтому у вас есть каждая нить, которая ничего не делает, ожидая, пока другой закончит свою работу. – Jacob
Спасибо вам большое. Теперь я успел пройти несколько статей и, наконец, сделал это! Мне жаль, что вместо моего ответа я принял свой собственный ответ, но мне хотелось поделиться исходным кодом моей проблемы. – CodingYourLife