Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
任务并行库&x2B;winforms进度条_Winforms_Progress Bar_Task Parallel Library - Fatal编程技术网

任务并行库&x2B;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

我想使用任务中的委托更新winforms中的进度条

 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);//在这里工作
我++
}
});