C#学习教程:.NET4.0“TaskParallelLibrary”阶段支持进度报告和增量结果共享,可能可用的资源较少,但据我所读,该库对任务调度、异常等提供了非常特殊的处理处理和取消。但我没有找到任何关于进度报告和从任务发送增量结果的参考资料。这两件事似乎太重要了,不容忽视。您能否详细说明如何在TaskParallel库中处理这些问题或参考一些解释它们的文章?这个例子更新了一个进度条:usingSystem;使用系统线程;使用System.Threading.Tasks;使用System.Windows.Forms;ClassSimpleProgressBar:Form{[STAThread]staticvoidMain(string[]args){Application.EnableVisualStyles();应用程序运行(新的SimpleProgressBar());}protectedoverridevoidOnLoad(EventArgse){base.OnLoad(e);整数迭代=100;ProgressBarpb=newProgressBar();pb.Maximum=迭代;铅。Dock=DockStyle.Fill;控制.Add(铅);Task.ContinueWith(delegate{Parallel.For(0,iterations,i=>{Thread.SpinWait(50000000);//在这里工作BeginInvoke((Action)delegate{pb.Value++;});});});从Parallel.For内部更新进度条这是我最热门的搜索结果之一,这里仍然没有进度示例TaskParallelLibrary...我今天刚遇到TPL,因为我想开发新的多线程应用程序,但不使用BackgroundWorker(因为我之前阅读过有关任务的一些好代码)我从@StephenCleary的回答中编译了示例,他的链接很难找到progress和其他几个站点。这是一个非常简单的示例,说明如何以UI线程安全的方式执行Progress和Completed:Task.Factory.StartNew(()=>{//循环大约10秒,步长为10毫秒for(inti=0;i{//这是每次您想更新到UI线程时创建的任务。this.Text=i.ToString();},CancellationToken.None,TaskCreationOptions.None,currentTaskScheduler);}return"Finished!";}).ContinueWith(t=>{//这是一个新任务,将在主任务之后运行完成!this.Text+=""+t.Result;},currentTaskScheduler);以秒为单位显示1到1000,然后附加“完成!”字符串到表单的标题栏。您可以看到TaskScheduler是一种创建UI线程安全更新的棘手方法,因为我认为任务调度程序在主线程上运行。没有像BackgroundWorker这样的内置支持。可以直接使用SynchronizationContext;这里有一个很棒的视频:http://www.rocksolidknowledge.com/ScreenCasts.mvc/Watch?video=TasksAndThreadAffinity.wmv作者在此视频中开发了两种解决方案:一种使用SynchronizationContext,另一种使用TaskContinuations。对于您的问题,继续将不起作用,但SynchronizationContext方法可以正常工作。PS如果您正在创建可重用代码,当您捕获SynchronizationContext.Current时,您应该测试null并且(如果它为null)使用默认构造的SynchronizationContext。更新:我在我的博客上发布了这段代码。我的解决方案实际上是基于TaskScheduler将任务调度回UI线程,它使用SynchronizationContext。与接受的答案不同,此解决方案适用于WPF和Windows窗体。TPL不是专门用于UI支持的,您可以(仍然)使用BackgroundWorker。至于发送或处理中间结果,有一个新的集合类(ConcurrentQueue)来支持。要报告异步任务的进度,请将IProgress传递给异步方法。在该方法中,使用进度数据调用Report。调用者可以决定如何处理该进度报告(即忽略它或更新UI)。以上是C#学习教程:支持.NET4.0“任务并行库”中的进度报告和增量结果共享。整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
