编辑代码以使其成为线程安全的帖子评论
请参阅最后更新的问题。
你能帮我理解这段代码是线程安全的还是如何使它成为线程安全的?
设置
我的系统有一个非常简单的类,称为 WorkItem。
public class WorkItem
{
public int Id {get;set;}
public string Name {get;set;}
public DateTime DateCreated {get;set;}
public IList<object> CalculatedValues {get;set;}
}
有一个接口 ICalculator,它有一个方法,它接受一个工作项,执行计算并返回 true。
public interface ICalculator
{
bool Calculate(WorkItem WorkItem);
}
假设我们有两个 ICalculator 的实现。
public class BasicCalculator: ICalculator
{
public bool Calculate(WorkItem WorkItem)
{
//calculate some value on the WorkItem and populate CalculatedValues property
return true;
}
}
另一个计算器:
public class AnotherCalculator: ICalculator
{
public bool Calculate(WorkItem WorkItem)
{
//calculate some value on the WorkItem and populate CalculatedValues property
//some complex calculation on work item
if (somevalue==0) return false;
return true;
}
最后,在我的客户端类中,我注入了与运行相关的 ICalculators[]。然后我实例化 ExecuteCalculators() 方法。
现在我有大量的工作项,我想对它们执行计算,所以我创建了一个任务列表,其中每个任务负责实例化 CalculatorHandler 实例,然后获取一个工作项并通过执行 WaitAll() 来执行计算所有的任务
这是系统的简化版本。实际系统有一系列计算器,Calculators 和 CalculatorHandler 是通过 IoC 等注入的。
我的问题是 - 帮助我理解以下几点:
每个任务都会创建一个 CalculatorHandler 的新实例。这是否意味着 CalculatorHandler 中发生的任何事情都是线程安全的,因为它没有任何公共属性并且只是在计算器上循环?
计算器在所有任务之间共享,因为它们是 Client 类的成员变量,但它们被传递到为每个任务实例化的 CalculatorHandler。这是否意味着当所有任务运行时,由于创建了 CalculatorHandler 的新实例,因此 Calculators 是自动线程安全的,我们不会遇到任何线程问题,例如死锁等?
你能建议我如何使代码线程安全吗?是否最好将Func<'ICalculators>'[]传递给 Client 类,然后在每个任务中,我们可以执行 Func<'ICalculator'>() 然后将这些实例传递给 ICalculator 那里?Func<'ICalculator'> 将返回 ICalculator 的实例。
计算器是作为私有方法变量传入的,因此 CalulatorHandler 的其他实例不能运行相同的计算器实例,这是真的吗?还是因为计算器是引用类型,我们必然会遇到多线程问题?
尚方宝剑之说
相关分类