Следующий код абстрагирует мою настоящую задачу, которая заключается в прохождении каждого пикселя в растровом изображении.
myButtonCommand.execute(async () => {
await Task.Run(() => {
while(i++<1000000) {
// do some work
if(i % 1000 == 0) // only update on every 1000th iteration
{
ProgressChanged.Invoke(this, i); // fire update event
Thread.Sleep(n);
}
}
});
});
Лямбда, которая подается в myButtomCommand.execute
, работает в потоке пользовательского интерфейса.Но так как задачи не гарантированно выполняются в потоке пользовательского интерфейса, это не значит, что вызов Thread.Sleep(n)
мог бы заморозить поток пользовательского интерфейса?
Основная проблема заключается в том, что мне нужно обновить индикатор выполнения и безпри выполнении Thread.Sleep(n)
поток пользовательского интерфейса блокируется во время вращения Задачи.
Теперь то, что я в итоге сделал, использовало Thread.Sleep(0)
, поэтому он перейдет в спящий режим только в том случае, если потребуется запустить другой поток.Но я не понимаю, почему использование Thread.Sleep(n)
необходимо в первую очередь, поскольку, по крайней мере, в моих тестах оно все равно было в отдельном потоке.
Так что я запутался в двух вещах:
- Безопасно ли вызывать
Thread.Sleep(n)
из Задачи из потока пользовательского интерфейса? - В моем примере, почему
Thread.Sleep(n)
необходимо для обновления пользовательского интерфейса при выполнении Задачиотдельная тема?