gpt4 book ai didi

c# - Task.WaitAll 卡住应用程序 C#

转载 作者:行者123 更新时间:2023-11-30 13:13:03 24 4
gpt4 key购买 nike

我想尝试使用 Threading.Task (C#) 并行运行一些工作。在这个简单的例子中,我有一个带有进度条和按钮的表单。单击时调用 RunParallel 函数。没有 Task.WaitAll() 它似乎运行良好。但是,对于表单显示的 WaitAll 语句,什么也没有发生。我不明白我在下面的设置中做错了什么。提前致谢。

public partial class MainWindow : Form
{
public delegate void BarDelegate();
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, EventArgs e)
{
RunParallel();
}
private void RunParallel() {
int numOfTasks = 8;
progressBar1.Maximum = numOfTasks;
progressBar1.Minimum = 0;
try
{
List<Task> allTasks = new List<Task>();
for (int i = 0; i < numOfTasks; i++)
{
allTasks.Add(Task.Factory.StartNew(() => { doWork(i); }));
}
Task.WaitAll(allTasks.ToArray());
}
catch { }
}
private void doWork(object o1)
{
// do work...
// then
this.Invoke(new BarDelegate( UpdateBar ));
}
private void UpdateBar()
{
if (progressBar1.Value < progressBar1.Maximum) progressBar1.Value++;
}
}

最佳答案

您正在等待 UI 线程。这会卡住 UI。不要那样做。

此外,您陷入死锁是因为 Invoke 等待 UI 线程解除阻塞。

我的建议:尽可能使用 async/await

并且不要吞下异常。您正在以这种方式为自己创造 future 的工作。

关于c# - Task.WaitAll 卡住应用程序 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21167757/

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