动作委托内的任务实例

时间:2012-07-26 11:04:43

标签: c# .net task-parallel-library

我无法在下面的代码中使用我的任务的操作委托中的任务实例(t)。我收到以下错误:

  

使用未分配的局部变量't'

代码:

Task t = Task.Factory.StartNew(() =>
{
    MessageBox.Show(t.Id.ToString());
});

现在,如果我执行以下操作,它会起作用:

Task t = null;
t = Task.Factory.StartNew(() =>
{
    MessageBox.Show(t.Id.ToString());
});

有人可以解释为什么会这样吗?

2 个答案:

答案 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并在一个语句中使用它(在那里只有一个分号)。

在第二个例子中,这是两个单独的陈述,因此它将起作用。