gpt4 book ai didi

c# - Rx Task.Factory.StartNew 在 .Net 3.5 问题上启动两个任务

转载 作者:太空狗 更新时间:2023-10-30 01:10:36 31 4
gpt4 key购买 nike

我在 .Net 3.5 上使用 Reactive Extensions 库的任务部分

它的工作大部分都很顺利,但在一个地方它会调用同一个任务两次。

调用看起来像这样:

Task.Factory.StartNew(
() => Processor.ProcessMessage(incomingMessage),
TaskCreationOptions.PreferFairness );

有什么想法吗?这是错误吗?

----更新

我认为问题在于 c# 在 lambda 中执行闭包的方式。问题不在 TPL 中,普通的旧线程池返回了同样的问题。

这解决了它:

foreach (var Processor in processors)
{
object[] crap = new object[2];
crap[0] = Processor;
crap[1] = incomingMessage;
Task.Factory.StartNew(Magic, crap, TaskCreationOptions.PreferFairness);
}

public void Magic(object obj)
{
object[] crap =(object[]) obj;
((IIncomingMessageProcessor)crap[0]).ProcessMessage((IncomingMessageBase)crap[1]);
}

原始来源是:

foreach (var Processor in processors)
{
Task.Factory.StartNew(
() => Processor.ProcessMessage(incomingMessage),
TaskCreationOptions.PreferFairness );
}

所以我在处理器周围有闭包,我猜问题是它正在为 lambda 回收同一个对象并交换处理器。

----更新2

我确信这就是问题所在。我重构并调试了 System.Threading.dll我两次创建任务时,它都是使用相同的委托(delegate)(相同的 ObjectID)创建的,并且处理器在迭代之间的 Target 属性中发生变化。有人知道一个好的解决方法吗?

----更新3这也有效(感谢 Judah Himango):

foreach (var processor in processors)
{
var crap = processor;
Task.Factory.StartNew(() => crap.ProcessMessage(incomingMessage), TaskCreationOptions.PreferFairness);
}

最佳答案

您是否在 lambda 中使用循环变量?例如

foreach (var foo in blah)
{
// You're capturing foo inside a lambda -- this probably won't do what you think it will!
Task.Factory.StartNew(() => foo.Something());
}

参见 Why is it bad to use an iteration variable in a lambda expression?

2012 年 11 月更新:新的 C# 5 编译器通过更改行为以捕获 foreach 循环变量(即预期行为)解决了这一困惑领域。 C# 团队的 Eric Lippert writes ,

We are taking the breaking change. In C# 5, the loop variable of a foreach will be logically inside the loop, and therefore closures will close over a fresh copy of the variable each time. The "for" loop will not be changed.

关于c# - Rx Task.Factory.StartNew 在 .Net 3.5 问题上启动两个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4378296/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com