我无法在下面的代码中使用我的任务的操作委托中的任务实例(t
)。我收到以下错误:
使用未分配的局部变量't'
代码:
Task t = Task.Factory.StartNew(() =>
{
MessageBox.Show(t.Id.ToString());
});
现在,如果我执行以下操作,它会起作用:
Task t = null;
t = Task.Factory.StartNew(() =>
{
MessageBox.Show(t.Id.ToString());
});
有人可以解释为什么会这样吗?
答案 0 :(得分:4)
C#编译器对Task.Factory.StartNew
一无所知。就编译器而言,在调用t
后可以随时访问StartNew
,包括分配t
之前的时间。
您的第二个代码段有一个竞争条件:如果并发线程上的任务在分配完成之前到达显示消息框,您将看到一个空引用异常。
尝试此实验:
private static Task Wrapper(Action f) {
var res = Task.Factory.StartNew(f);
Thread.Sleep(1000);
return res;
}
现在,在第二个代码段中调用Task.Factory.StartNew
替换Wrapper
的直接呼叫,并观看程序崩溃。
Task t = null;
t = Wrapper(() => {
MessageBox.Show(t.Id.ToString());
});
答案 1 :(得分:2)
首先必须为t赋值,以便它获得对Task类型对象的引用。
在第一段代码中,您尝试将值赋给t并在一个语句中使用它(在那里只有一个分号)。
在第二个例子中,这是两个单独的陈述,因此它将起作用。