Task.Factory.StartNew“操作”参数和更高级别的局部变量
考虑一下:
void StartUpdate(DataRequest dataRequest)
{
Task.Factory.StartNew(request => {... do something with "request" ...},
dataRequest);
}
现在,我的问题是:我可以在 lambda 表达式中使用 dataRequest,而不是将其作为第二个参数传递给 StartNew 方法吗?我担心的是 - 该方法将在不同的线程上执行,我不确定 dataRequest 在那里使用时是否会保持其状态。
Consider this:
void StartUpdate(DataRequest dataRequest)
{
Task.Factory.StartNew(request => {... do something with "request" ...},
dataRequest);
}
Now, my question: can I use dataRequest inside the lambda expression, instead of passing it as second parameter to StartNew method? My concern is - that method will be executed on a different thread and I'm not sure if dataRequest would keep its state when used there.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
回答你的问题,你可以,但它可能不是线程安全的。我学习使用 ThreadLocal 来提供帮助。
在您的委托方法内部应该隔离您的 dataRequest。
/* 我从 C# 中的 Pro .NET 并行编程 */
Answer to your question, You can but it may not threadsafe. I learn to use ThreadLocal to help.
inside your delegate method should Isolate your dataRequest.
/* I get it from Pro .NET Parallel Programming in C# */
我也有同样的问题。使用 Action 而不是 lambda 表达式。
I had the same problem. Use Action instead of the lambda expression.
是的,你可以。
这称为闭包;这是一个非常强大的功能。
线程安全性或缺乏线程安全性也没有什么不同。
无论您是通过闭包还是通过 StartNew 参数获取实例,它仍然是同一个对象。 (除非它是一个
struct
,这将是难以形容的邪恶)Yes, you can.
This is called a Closure; it's a very powerful feature.
The thread-safety, or lack thereof, will be no different.
Whether you get the instance through the closure or through a
StartNew
parameter, it's still the same object. (Unless it's astruct
, which would be indescribably evil)