tim*_*ado 3 c# task task-parallel-library
我想尝试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++;
}
}
Run Code Online (Sandbox Code Playgroud)
usr*_*usr 12
您正在等待UI线程.这会冻结用户界面.不要那样做.
此外,您正在死锁,因为Invoke等待UI线程解除阻塞.
我的建议:async/await尽可能使用.
而且,请不要吞咽异常.你正在以这种方式为自己创造未来的工作.