C#TPL:在外部作用域实例上调用方法
所以我的标题相当模糊,这是我担心的。我能在块外声明的类的实例上调用方法而不遇到陷阱吗 下面的代码结构是否存在并发问题C#TPL:在外部作用域实例上调用方法,c#,multithreading,task-parallel-library,tpl-dataflow,C#,Multithreading,Task Parallel Library,Tpl Dataflow,所以我的标题相当模糊,这是我担心的。我能在块外声明的类的实例上调用方法而不遇到陷阱吗 下面的代码结构是否存在并发问题 HeavyLifter hl = new HeavyLifter(); var someActionBlock = new ActionBlock<string>(n => { int liftedStuff= hl.DoSomeHeavyLifting(n); if (liftedStuff> 0) ..... }); HeavyL
HeavyLifter hl = new HeavyLifter();
var someActionBlock = new ActionBlock<string>(n =>
{
int liftedStuff= hl.DoSomeHeavyLifting(n);
if (liftedStuff> 0)
.....
});
HeavyLifter hl=新的HeavyLifter();
var someActionBlock=新的ActionBlock(n=>
{
int liftedStuff=hl.剂量重提升(n);
如果(liftedStuff>0)
.....
});
下面是我关注的问题
HeavyLifter
实例是否安全取决于DoSomeHeavyLifting
方法是否有副作用。也就是说,DoSomeHeavyLifting
是否修改HeavyLifter
对象状态的任何内容。(或任何其他引用对象)DoSomeHeavyLifting
在内部做什么。如果它是精心构建的,那么按照你的方式来称呼它是没有问题的。但是,如果DoSomeHeavyLifting
修改了状态,或者该状态被修改为任何其他操作的副作用,则必须在整个体系结构的上下文中决定如何处理它。例如,您是允许状态更改并强制原子性,还是防止任何影响操作的状态更改?如果不知道这个方法实际上在做什么,就不可能给出任何具体的建议
通常,在设计并发性时,最好假设最坏的情况:
- 如果竞赛条件可能发生,它将发生
- 当竞赛条件发生时,您将以代码允许的最复杂方式输掉竞赛
- 非原子状态更新将相互损坏,并使对象处于未定义状态
- 如果使用锁,可能会出现死锁的情况
- 调试中从未发生过的事情,总是会在发行版中发生
HeavyLifter
实例是否安全取决于DoSomeHeavyLifting
方法是否有副作用。也就是说,DoSomeHeavyLifting
是否修改HeavyLifter
对象状态的任何内容。(或任何其他引用对象)DoSomeHeavyLifting
在内部做什么。如果它是精心构建的,那么按照你的方式来称呼它是没有问题的。但是,如果DoSomeHeavyLifting
修改了状态,或者该状态被修改为任何其他操作的副作用,则必须在整个体系结构的上下文中决定如何处理它。例如,您是允许状态更改并强制原子性,还是防止任何影响操作的状态更改?如果不知道这个方法实际上在做什么,就不可能给出任何具体的建议
通常,在设计并发性时,最好假设最坏的情况:
- 如果竞赛条件可能发生,它将发生
- 当竞赛条件发生时,您将以代码允许的最复杂方式输掉竞赛
- 非原子状态更新将相互损坏,并使对象处于未定义状态
- 如果使用锁,可能会出现死锁的情况
- 调试中从未发生过的事情,总是会在发行版中发生
HeavyLifter
实例是否安全取决于DoSomeHeavyLifting
方法是否有副作用。也就是说,DoSomeHeavyLifting
是否修改HeavyLifter
对象状态的任何内容。(或任何其他引用对象)DoSomeHeavyLifting
在内部做什么。如果它是精心构建的,那么按照你的方式来称呼它是没有问题的。但是,如果DoSomeHeavyLifting
修改了状态,或者该状态被修改为任何其他操作的副作用,则必须在整个体系结构的上下文中决定如何处理它。例如,您是允许状态更改并强制原子性,还是防止任何影响操作的状态更改?如果不知道这个方法实际上在做什么,就不可能给出任何具体的建议
通常,在设计并发性时,最好假设最坏的情况: