跟踪多步任务的进度我正在开发一个简单的服务器,它向客户端公开一个web服务。有些请求可能需要很长时间才能完成,逻辑上分为多个步骤。对于此类请求,需要在执行过程中报告进度。此外,可以在前一个请求完成之前启动一个新请求,并且需要两个请求同时执行(禁止某些特定于系统的限制)。我希望服务器将TaskId返回给它的客户端,并让客户端使用TaskId跟踪请求的进度。我认为这是一个很好的方法,我剩下的问题是如何管理任务。从未使用过TPL,我认为这是解决此问题的好方法。事实上,它允许我同时运行多个任务而无需手动管理线程。我什至可以使用ContinueWith相对轻松地创建多步骤任务。但是,我想不出跟踪任务进度的好方法。我意识到,当我的请求包含一个“步骤”时,该步骤必须合作报告其状态。在这一点上,我宁愿避免这种情况。但是,当请求包含多个步骤时,我想知道当前正在执行哪个步骤并相应地报告进度。我能想到的唯一方法很无聊:TaskfirstTask=newTask(()=>{DoFirstStep();return3.14;});第一个任务。ContinueWith(task=>{UpdateProgress("50%");returntask.Result;}).ContinueWith(task=>{DoSecondStep(task.Result);返回"blah";}.ContinueWith(task=>{UpdateProgress(“100%”);returntask.Result;})。不完美,因为我希望Task存储自己的进度,而不是让UpdateProgress更新一些已知位置。此外,它有一个明显的缺点,那就是必须进行大量更改添加新步骤时的位置(因为进度现在是33%、66%、100%而不是50%、100%)。有人有好的解决方案吗?谢谢!这不是任务并行库完全支持的场景.您可能会考虑将进度更新提供给队列并在另一个任务中读取它们的方法:staticvoidMain(string[]args){Example();}staticBlockingCollection>_progressMessages=newBlockingCollection>();publicstaticvoidExample(){List>tasks=newList>();对于(inti=0;i{intid=(int)state;DoFirstStep(id);_progressMessages.Add(newTuple(id,1,"10.0%"));DoSecondStep(id);_progressMessages.Add(newTuple(id,2,"50.0%"));//...return1;},(object)i));任务记录器=任务。Factory.StartNew(()=>{foreach(varmin_progressMessages.GetConsumingEnumerable())Console.WriteLine("任务{0}:步骤{1},进度{2}。",m.Item1,m.Item2,m.Item3);});列表waitOn=newList(tasks.ToArray());waitOn.Add(记录器);Task.WaitAll(waitOn.ToArray());控制台.ReadLine();}privatestaticvoidDoSecondStep(intid){Console.WriteLine("{0}:第一步",id);}privatestaticvoidDoFirstStep(intid){Console.WriteLine("{0}:第二步",id);此示例不显示取消、错误处理或对任务的潜在长期运行需求的说明。长时间运行的任务对调度程序提出了特殊要求。有关这方面的更多讨论,请访问http://parallelpatterns.codeplex.com/,下载本书草稿并查看第3章。这只是在这种情况下使用任务并行库的方式。TPL可能不是这里的最佳方法。如果您的Web服务在ASP.NET(或类似的Web应用程序服务器)中运行,那么您还应该考虑使用线程池中的线程执行任务而不是为Web请求提供服务的可能影响:TaskParallelLibraryworksinTerminalWeb应用程序中的服务器或扩展?我认为您正在寻找的解决方案不会涉及任务API。或者至少,不是直接的。它不支持完成百分比的概念,并且Task/ContinueWith函数需要参与该逻辑,因为它的数据仅在该级别可用(完成百分比仅在最终调用ContinueWith时才知道,即使那样,算法上这样做是最好的猜测,因为它当然不知道一个任务是否会比另一个任务花费更长的时间。我建议您创建自己的API来执行此操作,可能利用TaskAPI来完成实际工作。Thismighthelp:http://blog.stephencleary.com/2010/06/reporting-progress-from-tasks.html.除了报告进度之外,该解决方案还支持在不使跨线程操作无效的情况下更新表单控件。是C#学习教程:跟踪多步任务进度的所有内容分享,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——本文采集自互联网,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
