Может ли вызов Thread.Sleep (n) из Задачи из потока пользовательского интерфейса заморозить пользовательский интерфейс? - PullRequest
0 голосов
/ 01 июня 2018

Следующий код абстрагирует мою настоящую задачу, которая заключается в прохождении каждого пикселя в растровом изображении.

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) необходимо в первую очередь, поскольку, по крайней мере, в моих тестах оно все равно было в отдельном потоке.

Так что я запутался в двух вещах:

  1. Безопасно ли вызывать Thread.Sleep(n) из Задачи из потока пользовательского интерфейса?
  2. В моем примере, почему Thread.Sleep(n) необходимо для обновления пользовательского интерфейса при выполнении Задачиотдельная тема?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Похоже, и я могу заверить вас, что пользовательский интерфейс не останавливается.
Посмотрите прогресс на асинхронном.

await Task.Delay(500); может быть все, что вам нужно.

async Task<int> TaskDelayAsync(CancellationToken ct, IProgress<int> progress)
{ 
    int i = 0; 
    while (true)
    {               
        i++;
        //Debug.WriteLine(i);
        progress.Report(i);
        ct.ThrowIfCancellationRequested();
        await Task.Delay(500);
    }
    return i;
}
0 голосов
/ 01 июня 2018

и без выполнения Thread.Sleep (n) поток пользовательского интерфейса блокируется во время вращения Задачи.

Это означает, что вы просто вызывали слишком много Призывов здесь.
Поток GUI не был «заблокирован», просто перегружен.

Другой, и, вероятно, лучший подход

 //if(i % 1000 == 0) 
   if(i % 1000000 == 0) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...