Task.Factory.StartNew“操作”参数和更高级别的局部变量

发布于 2024-10-05 14:01:25 字数 318 浏览 7 评论 0原文

考虑一下:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

佼人 2024-10-12 14:01:36

回答你的问题,你可以,但它可能不是线程安全的。我学习使用 ThreadLocal 来提供帮助。

在您的委托方法内部应该隔离您的 dataRequest。

ThreadLocal<DataRequest> tls = new ThreadLocal<DataRequest>();

Task.Factory.StartNew(request => {
   tls.Value = (DataRequest)stateObject;

   ///
}, 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.

ThreadLocal<DataRequest> tls = new ThreadLocal<DataRequest>();

Task.Factory.StartNew(request => {
   tls.Value = (DataRequest)stateObject;

   ///
}, dataRequest);

/* I get it from Pro .NET Parallel Programming in C# */

以往的大感动 2024-10-12 14:01:35

我也有同样的问题。使用 Action 而不是 lambda 表达式。

private void StartUpdate(DataRequest dataRequest)
{
    Action<DataRequest> pobjAction = new Action<DataRequest>(DoSomething);
    Task.Factory.StartNew(pobjAccion, dataRequest);
}


private void DoSomething(DataRequest dataRequest)
{
    Trace.WriteLine(dataRequest.ToString());
}

I had the same problem. Use Action instead of the lambda expression.

private void StartUpdate(DataRequest dataRequest)
{
    Action<DataRequest> pobjAction = new Action<DataRequest>(DoSomething);
    Task.Factory.StartNew(pobjAccion, dataRequest);
}


private void DoSomething(DataRequest dataRequest)
{
    Trace.WriteLine(dataRequest.ToString());
}
你的背包 2024-10-12 14:01:33

是的,你可以。
这称为闭包;这是一个非常强大的功能。

线程安全性或缺乏线程安全性也没有什么不同。
无论您是通过闭包还是通过 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 a struct, which would be indescribably evil)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文