winforms 尽管使用了await Task.Run(),代码仍在等待循环结束

t8e9dugd  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一段代码,我想使用Task.Run()在后台运行一个循环,并使用Invoke()更新循环中的一些UI元素。但是,即使在使用awaitTask.Run()之后,代码仍然会等待循环结束,然后才继续执行下一行代码。
下面是相关的代码片段:

await Task.Run(() =>
{
    while (panel1.Controls.Contains(button))
    {
        button.Invoke((MethodInvoker)(() =>
        {
            // UI update logic here
        }));
        Thread.Sleep(1);
    }
});

字符串
我期望通过使用awaitTask.Run(),循环将在后台异步运行,从而允许代码继续执行。但是,代码似乎仍然要等待循环完成才能继续前进。
我错过了什么吗?如何确保代码继续执行而不等待循环结束?如果你能帮忙的话,我将不胜感激。谢谢你,谢谢

von4xj4u

von4xj4u1#

没有什么严重的问题。当你把await放在一个可等待的调用之前(例如Task.Run)它等待它到最后。
你所做的绝对可以防止你的UI线程阻塞。有一个老问题,我们在WinForm, WPF, ...上没有async/await
所以如果你想在后台运行这个任务,你应该这样做:

var BackgroundTask = Task.Run(() =>
 {
     while (panel1.Controls.Contains(button))
     {
         button.Invoke((MethodInvoker)(() =>
         {
             // UI update logic here
         }));
         Thread.Sleep(1);
     }
 });

字符串
现在你可以随时停止这个任务,它不会像以前那样阻塞你的UI线程。

相关问题