Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#TPL:在外部作用域实例上调用方法_C#_Multithreading_Task Parallel Library_Tpl Dataflow - Fatal编程技术网

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)
.....
});
下面是我关注的问题

  • 该块可能有多个线程同时运行,并且这些线程中的每一个都可以进入DoSomeHeavyLifting方法。每个函数调用都有自己的帧指针吗?我应该确保我没有引用CountWords范围之外的任何变量吗

  • 有没有比在我的块中实例化HeavyLifter更好的方法

  • 非常感谢您的帮助,我并没有太迷茫,但我知道并发是潜在错误和角落案例之王

  • 假设帧指针指的是堆栈帧,那么是的,每个调用都会获得自己的堆栈帧和相关变量。如果函数的参数是引用类型,则所有参数都将引用同一对象
  • 对所有调用使用相同的
    HeavyLifter
    实例是否安全取决于
    DoSomeHeavyLifting
    方法是否有副作用。也就是说,
    DoSomeHeavyLifting
    是否修改
    HeavyLifter
    对象状态的任何内容。(或任何其他引用对象)
  • 最终,这样做是否安全很大程度上取决于
    DoSomeHeavyLifting
    在内部做什么。如果它是精心构建的,那么按照你的方式来称呼它是没有问题的。但是,如果
    DoSomeHeavyLifting
    修改了状态,或者该状态被修改为任何其他操作的副作用,则必须在整个体系结构的上下文中决定如何处理它。例如,您是允许状态更改并强制原子性,还是防止任何影响操作的状态更改?如果不知道这个方法实际上在做什么,就不可能给出任何具体的建议

    通常,在设计并发性时,最好假设最坏的情况:

    • 如果竞赛条件可能发生,它将发生
    • 当竞赛条件发生时,您将以代码允许的最复杂方式输掉竞赛
    • 非原子状态更新将相互损坏,并使对象处于未定义状态
    • 如果使用锁,可能会出现死锁的情况
    • 调试中从未发生过的事情,总是会在发行版中发生
  • 假设帧指针指的是堆栈帧,那么是的,每个调用都会获得自己的堆栈帧和相关变量。如果函数的参数是引用类型,则所有参数都将引用同一对象
  • 对所有调用使用相同的
    HeavyLifter
    实例是否安全取决于
    DoSomeHeavyLifting
    方法是否有副作用。也就是说,
    DoSomeHeavyLifting
    是否修改
    HeavyLifter
    对象状态的任何内容。(或任何其他引用对象)
  • 最终,这样做是否安全很大程度上取决于
    DoSomeHeavyLifting
    在内部做什么。如果它是精心构建的,那么按照你的方式来称呼它是没有问题的。但是,如果
    DoSomeHeavyLifting
    修改了状态,或者该状态被修改为任何其他操作的副作用,则必须在整个体系结构的上下文中决定如何处理它。例如,您是允许状态更改并强制原子性,还是防止任何影响操作的状态更改?如果不知道这个方法实际上在做什么,就不可能给出任何具体的建议

    通常,在设计并发性时,最好假设最坏的情况:

    • 如果竞赛条件可能发生,它将发生
    • 当竞赛条件发生时,您将以代码允许的最复杂方式输掉竞赛
    • 非原子状态更新将相互损坏,并使对象处于未定义状态
    • 如果使用锁,可能会出现死锁的情况
    • 调试中从未发生过的事情,总是会在发行版中发生
  • 假设帧指针指的是堆栈帧,那么是的,每个调用都会获得自己的堆栈帧和相关变量。如果函数的参数是引用类型,则所有参数都将引用同一对象
  • 对所有调用使用相同的
    HeavyLifter
    实例是否安全取决于
    DoSomeHeavyLifting
    方法是否有副作用。也就是说,
    DoSomeHeavyLifting
    是否修改
    HeavyLifter
    对象状态的任何内容。(或任何其他引用对象)
  • 最终,这样做是否安全很大程度上取决于
    DoSomeHeavyLifting
    在内部做什么。如果它是精心构建的,那么按照你的方式来称呼它是没有问题的。但是,如果
    DoSomeHeavyLifting
    修改了状态,或者该状态被修改为任何其他操作的副作用,则必须在整个体系结构的上下文中决定如何处理它。例如,您是允许状态更改并强制原子性,还是防止任何影响操作的状态更改?如果不知道这个方法实际上在做什么,就不可能给出任何具体的建议

    通常,在设计并发性时,最好假设最坏的情况: