3

考虑一下:

void StartUpdate(DataRequest dataRequest)
{
    Task.Factory.StartNew(request => {... do something with "request" ...}, 
        dataRequest);
}

现在,我的问题是:我可以在 lambda 表达式中使用 dataRequest,而不是将其作为第二个参数传递给 StartNew 方法吗?我担心的是 - 该方法将在不同的线程上执行,我不确定 dataRequest 在那里使用时是否会保持其状态。

4

3 回答 3

6

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

线程安全性或缺乏线程安全性也不例外。
无论您是通过闭包还是通过StartNew参数获取实例,它仍然是同一个对象。(除非它是一个struct,这将是无法形容的邪恶)

于 2010-12-03T03:18:46.253 回答
2

我有同样的问题。使用 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());
}
于 2011-03-22T20:16:55.670 回答
1

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

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

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

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

   ///
}, dataRequest);

/* 我从Pro .NET Parallel Programming in C# 中得到它*/

于 2010-12-03T03:32:41.217 回答