我正在开发一个向客户端公开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; } ).
Run Code Online (Sandbox Code Playgroud)
即使这不完美,因为我希望Task存储自己的进度,而不是让UpdateProgress更新一些已知的位置.此外,在添加新步骤时必须更改大量位置的明显缺点(因为现在进度为33%,66%,100%而不是50%,100%).
有没有人有一个好的解决方案?
谢谢!