gpt4 book ai didi

c# - 从任务并行库问题更新 UI

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:12 25 4
gpt4 key购买 nike

我正在学习 TPL 的艺术。因此,我尝试从 TPL 以增量方式更新 UI,但我做对了。这是我正在使用的代码:

    int i = 0, flag = 5;
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
while (i < flag)
{
Task.Factory.StartNew(() =>
{
this.Text = i.ToString();
//System.Threading.Thread.SpinWait(50000000);
}, System.Threading.CancellationToken.None, TaskCreationOptions.None, uiScheduler);
i++;
System.Threading.Thread.Sleep(1000);

}
}, System.Threading.CancellationToken.None, TaskCreationOptions.None, uiScheduler);

我正在尝试以增量方式更新 Windows 标题栏 UI。代码运行无一异常(exception),但 UI 不会更新,直到我的值变为 5。我想展示它; 1,然后 2 等等,直到 i 是 5。

当我运行我的程序时,我注意到我的程序挂起,直到任务完成或结束。

在使用任务时更新 UI 方面我做错了什么?

另一种方法1

        Task.Factory.StartNew(() =>
{
Parallel.For(1, 6, i =>
{
System.Threading.Thread.SpinWait(500000000); do work here
BeginInvoke((Action)delegate { this.Text = i.ToString(); });
});
});

另一种方法2

int i = 0, flag = 5;
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
while (i < flag)
{
Task.Factory.StartNew(() =>
{
this.Text = i.ToString();
}, System.Threading.CancellationToken.None, TaskCreationOptions.None, uiScheduler);
i++;
System.Threading.Thread.SpinWait(50000000); // do work here


}
}); // <---- Removed arguments (specifically uiScheduler)

最佳答案

您是在告诉任务在启动初始任务时使用 uiScheduler 上下文。删除它,您的代码应该没问题。

int i = 0, flag = 5;
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
while (i < flag)
{
Task.Factory.StartNew(() =>
{
this.Text = i.ToString();
}, System.Threading.CancellationToken.None, TaskCreationOptions.None, uiScheduler);
i++;
System.Threading.Thread.Sleep(1000);

}
}); // <---- Removed arguments (specifically uiScheduler)

关于c# - 从任务并行库问题更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16939483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com