Длительный процесс заморозки пользовательского интерфейса, как обновить с помощью потоков? - PullRequest
1 голос
/ 24 декабря 2010

Я написал этот пример кода для длительного процесса, но форма Windows зависает до завершения процесса.Как мне изменить код, чтобы работа шла параллельно?

var ui = TaskScheduler.FromCurrentSynchronizationContext();
Task t = Task.Factory.StartNew(delegate
{
    textBox1.Text = "Enter Thread";
    for (int i = 0; i < 20; i++)
    {
        //My Long Running Work
    }
    textBox1.Text = textBox1.Text + Environment.NewLine + "After Loop";
}, CancellationToken.None, TaskCreationOptions.None, ui);

1 Ответ

7 голосов
/ 24 декабря 2010

Вы можете использовать продолжение.Я не помню точный синтаксис, но это что-то вроде:

textBox1.Text = "Enter Thread"; //assuming here we're on the UI thread
Task t = Task.Factory.StartNew(delegate
{                
    for (int i = 0; i < 20; i++)
    {
        //My Long Running Work
    }
    return result;
})
.ContinueWith(ret => textBox1.Text = textBox1.Text + Environment.NewLine + result, 
    TaskScheduler.FromCurrentSynchronizationContext());

Альтернативой может быть что-то вроде:

Task t = Task.Factory.StartNew(delegate
{
    YourForm.Invoke((Action)(() => textBox1.Text = "Enter Thread");
    for (int i = 0; i < 20; i++)
    {
        //My Long Running Work
    }
    YourForm.Invoke((Action)(() => textBox1.Text = textBox1.Text + Environment.NewLine + result);}, 
        CancellationToken.None, TaskCreationOptions.None);

Опять же, я не помню точный синтаксис, ноИдея состоит в том, что вы хотите выполнить длинную операцию в потоке , отличном от потока пользовательского интерфейса , но сообщить о ходе выполнения (включая завершение) в потоке пользовательского интерфейса.

Кстати, BackGroundWorker класс будет работать здесь очень хорошо (лично мне это очень нравится).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...