当前位置: 首页 > 编程语言 > C#

C#LearningTutorial-TPLDataflowLocalStorageorsomethinglikethatShare

时间:2023-04-10 16:21:08 C#

TPLDataflowLocalStorageorsomethinglikethat我想要完成的是我有一个MaxDegreeOfParallelism=4的动作块。我想创建一个本地实例每个并行路径的会话对象,所以我总共需要4个会话对象。如果这是线程,我会创建类似这样的东西:ThreadLocalsessionPerThread=newThreadLocal(()=>newSession());我知道块不是线程所以我正在寻找类似的东西但是块。有没有办法创建这个?该区块已投入使用,可连续运行数月。这段时间block的每个concurrencyslot都使用了大量线程,thread-localstorage不适合。我需要一些与逻辑块槽有关的东西。这个块也永远不会完成,它运行服务的整个生命周期。注意:上面的建议答案不适用于我的要求。我特别要求与本机线程不同的东西,上面的答案使用本机线程。那是完全不同的问题。听起来您似乎已经知道Dataflow块绝对不能保证块、执行和线程之间的关联性。即使将最大并行度设置为4,所有4个任务也可以在同一个线程上执行。或者可以在多个线程上执行单个任务。鉴于您最终想要重用昂贵服务的n个实例以实现n级并行性,让我们暂时不考虑数据流,因为它不会帮助(或直接阻碍)您问题的任何通用解决方案。其实很简单。您可以使用ConcurrentStack,其中T是您实例化的服务类型。您的代码出现在代表您的一个并行工作单元的方法(或委托)的顶部:privateConcurrentStackreusableServices;privatevoidDoWork(){T服务;如果(!this.reusableServices.TryPop(outservice)){service=newT();//昂贵的建设}//使用你的共享服务。////代码在这里。//完成后将服务放回原处,以便其他人可以使用它。this.reusableServices.Push(服务);现在,通过这种方式,您可以快速看到您创建了与并行执行的DoWork()一样多的昂贵服务实例。您甚至不必硬编码所需的并行度。它与您实际安排并行性的方式正交(因此线程池、数据流、PLINQ等无关紧要)。因此,您可以使用DoWork()作为数据流块的委托,一切顺利。当然,这里的ConcurrentStack并没有什么神奇的地方,除了围绕push和pop的锁是内置在类型中的,所以你不必自己动手。以上就是C#学习教程的全部内容:TPLDataflowlocalstorageorsimilarthings。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: