【发布时间】:2014-01-05 12:52:07
【问题描述】:
在 .net 4.0 中使用任务并行库,我想知道这种情况的最佳解决方案是什么:
我的代码正在启动一项执行大量长时间运行步骤的任务(步骤需要一个接一个地完成)。 我有一个对象 Result 聚合每个步骤的结果。 结果对象在任务中被修改(所以在与此任务相关的线程中)。 我还有一个 Web 服务,我们可以在其中获取当前的 Result 对象以查看任务的进度。 所以 Result 对象是任务和我的代码的主线程之间的共享对象。确保我没有线程问题和类似问题的最佳方法是什么?
这里是我所说的示例。请注意,_doWork 不会像代码中那样是静态的,它将是层次结构中更高级别的另一个类的成员。
using System.Threading.Tasks;
namespace ConsoleApplication
{
public class Step1Result
{
}
public class Step2Result
{
}
public class Result
{
public Step1Result Step1Result;
public Step2Result Step2Result;
}
class DoWork
{
public Result Result;
public DoWork()
{
Result = new Result();
}
public void Process()
{
// Execute Step 1
Result.Step1Result = Step1();
Result.Step2Result = Step2();
// Other Steps ( long - running )
}
public Step1Result Step1()
{
// Long running step that can takes minutes
return new Step1Result();
}
public Step2Result Step2()
{
// Long running step that can takes minutes
return new Step2Result();
}
}
class Program
{
private static DoWork _doWork;
static void Main(string[] args)
{
_doWork = new DoWork();
var task = Task.Factory.StartNew(() => _doWork.Process());
task.Wait();
}
// This method will be called from a web service at anytime.
static Result CalledFromWebService()
{
return _doWork.Result;
}
}
}
这里的麻烦是从任务和主线程访问 _doWork.Result。真的 ?可以做些什么来克服这个问题?
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
您真正的问题是您没有正确建模服务请求。一旦你真正实现它,你会发现请求已经在一个工作线程上运行。无需启动自己的线程,无需使用全局变量。只需调用 Process 并返回 Result。
-
Hans - 需要明确的是,流程部分不会在 Web 服务调用中完成。 Web 服务调用将只检查当前结果值并将其返回给调用。当您说 Web 服务调用将在自己的线程中运行时,您是正确的。 Process 部分将在 Windows 服务的“主任务”内完成。
标签: c# multithreading task-parallel-library