我正在开发一个向客户端公开Web服务的简单服务器。某些请求可能需要很长时间才能完成,并且逻辑上分为多个步骤。对于这样的请求,需要在执行期间报告进度。另外,新的请求可以在前一个完成之前启动,并且要求两者同时执行(禁止某些系统特定的限制)。跟踪多步骤任务的进度
我在考虑让服务器返回一个TaskId给它的客户端,让客户端使用TaskId跟踪请求的进度。我认为这是一个很好的方法,而我留下的是如何管理任务的问题。
从来没有使用TPL,我认为这将是一个很好的方法来解决这个问题。事实上,它允许我同时运行多个任务,而无需手动管理线程。我甚至可以使用ContinueWith相对轻松地创建多步骤任务。但是,我不能想出跟踪任务进度的好方法。我意识到,当我的请求包含一个“步骤”时,那么该步骤必须合作报告其状态。这是我在这一点上宁愿避免的。但是,当请求包含多个步骤时,我想知道当前正在执行哪个步骤并据此报告进度。我能想出的唯一办法是极其无聊的:
Task<int> firstTask = new Task(() => { DoFirstStep(); return 3.14; });
firstTask.
ContinueWith<int>(task => { UpdateProgress("50%"); return task.Result; }).
ContinueWith<string>(task => { DoSecondStep(task.Result); return "blah"; }.
ContinueWith<string>(task => { UpdateProgress("100%"); return task.Result; }).
即使这是不完美的,因为我想任务来存储,而不必更新的UpdateProgress一些已知的位置了自己的进步。另外,当增加一个新步骤时(因为现在的进度是33%,66%,100%而不是50%,100%),它具有不得不改变很多地方的明显缺点。
有没有人有一个很好的解决方案?
谢谢!
感谢您的详细回复!我同意TPL可能不是这里最好的方法。我希望有机会使用它,但它可能要等待另一天... – 2010-08-05 05:05:04