任务并行库&x2B;winforms进度条
我想使用任务中的委托更新winforms中的进度条任务并行库&x2B;winforms进度条,winforms,progress-bar,task-parallel-library,Winforms,Progress Bar,Task Parallel Library,我想使用任务中的委托更新winforms中的进度条 scheduler = TaskScheduler.FromCurrentSynchronizationContext(); public delegate void NotifyAboutIterationEnd(int iteration); public event NotifyAboutIterationEnd Notify; var task = Task.Factory.Star
scheduler = TaskScheduler.FromCurrentSynchronizationContext();
public delegate void NotifyAboutIterationEnd(int iteration);
public event NotifyAboutIterationEnd Notify;
var task = Task.Factory.StartNew(() =>
{
//...
Task.Factory.StartNew(() =>
{
Notify(++index);
}, CancellationToken.None, TaskCreationOptions.None, scheduler);
//...
当我启动这段代码时,我能命中的最后一个断点是在Notify(++index)行中;
然后程序冻结,结束了。
如果我将调度程序更改为,例如,scheduler=TaskScheduler.Current;然后我有一个例外,gui不能从其他线程修改。这意味着代理/事件工作正常。那么为什么它在第一种情况下不起作用呢?这是因为Task.Factory.StartNew()实际上并不启动新任务,而是对其进行调度。即使在主要任务完成后,默认的调度程序也可以启动它们。记住任务!=线程。 Thread.Start-始终立即启动线程,Task.Factory.StartNew或Task.Start only调度。您可以在Task.Factory.StartNew()之后使用.Wait()。这将导致等待进度条更新。 但是,我是舒尔,这不是最好的解决方案。如果您的计算花费大量时间,我建议您使用Task creationoptions.long运行Task.Factory.start新建 并通知.BeginInvoke更新progressbar。通知事件的原因处理程序必须根据Winforms异步更新UI模式正确实现。 你可以在网站上看到一个例子 希望这有帮助 很好地缺乏平行性;) 你可以这样做
ProgressBar pb = new ProgressBar();
pb.Maximum = 100;
pb.Dock = DockStyle.Fill;
Controls.Add(pb);
int i = 0, flag = 5;
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
while (i <= 100
{
Task.Factory.StartNew(() =>
{
pb.Value++;
}, System.Threading.CancellationToken.None, TaskCreationOptions.None, uiScheduler);
System.Threading.Thread.SpinWait(50000000); // do work here
i++
}
});
ProgressBar pb=newprogressbar();
pb.最大值=100;
pb.Dock=DockStyle.Fill;
添加(pb);
int i=0,flag=5;
var uiScheduler=TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(()=>
{
而
{
pb.Value++;
},System.Threading.CancellationToken.None,TaskCreationOptions.None,uiScheduler);
System.Threading.Thread.SpinWait(50000000);//在这里工作
我++
}
});