【发布时间】:2011-06-29 23:05:47
【问题描述】:
我最近继承了一个系统,它使用一种非常基本的方法来处理工作项,基本上,它会一个一个地处理它们。老实说,直到最近这还不错。但是,我们正在寻求为另一种类型的工作项实施类似的流程,我一直在研究任务并行库,并认为这符合要求。但是,我对线程安全有些担忧,老实说,这是我缺乏知识的领域,所以我在这里只问我的第二个问题,希望有人能给我一些好处,因为我还没有找到确定是或否的答案。
所以我们有了“WorkItem”类
public class WorkItem
{
public int Id {get; set;}
public string data { get; set;}
}
将生成一个List<WorkItem>,然后使用Parallel.Foreach 循环对其进行处理。
Parallel.Foreach 将调用一个私有方法,而该私有方法又会调用另一个程序集的静态方法;
//Windows service that will run the Parallel.Foreach
private int MainMethod(WorkItem item)
{
item.Data = Processor.ProcessWorkItemDataProcess1(item.data);
item.Data = Processor.ProcessWorkItemDataProcess2(item.data);
SendToWorkFlow(item);
}
public static class Processor
{
public static string ProcessWorkItemDataProcess1(string data)
{
//Process it here
return string
}
public static string ProcessWorkItemDataProcess2(string data)
{
//Process it here
return string
}
}
等等。所有这些方法都包含在各个不同阶段处理 WorkItem 实例的逻辑。完成后,MainMethod 会将处理后的 WorkItem 发送到工作流系统。
我们将分批处理最多 30 个,以免其他系统过载。我的担忧基本上是 30 个 WorkItem 实例访问相同的静态方法可能会导致一些数据完整性问题。例如,ProcessWorkItemDataProcess2 用WorkItem1.Data 调用,随后用WorkItem2.Data 调用,不知何故,WorkItem2.Data 在它应该是WorkItem1.Data 时返回
所有静态方法都是自包含的,只要它们定义了逻辑并且只会(理论上)使用调用它的WorkItem。没有DB访问、文件访问等方法。
所以,希望这能解释我在做什么。我应该有什么顾虑吗?如果是这样,为每个 WorkItem 创建一个 Processor 类的实例会解决任何潜在问题吗?
提前致谢
【问题讨论】:
-
对我来说听起来相当安全,但对于并发代码,魔鬼总是在细节中。如果不仔细检查您正在谈论的确切代码,任何人都不可能给出任何明确的建议。
-
你会寻找什么样的东西?
标签: c# multithreading class static