我无法在下面的代码中直接在任务的操作委托(delegate)中使用我的任务实例 (t
)。我收到以下错误:
Use of unassigned local variable 't'
代码:
Task t = Task.Factory.StartNew(() =>
{
MessageBox.Show(t.Id.ToString());
});
现在,如果我执行以下操作,它就会起作用:
Task t = null;
t = Task.Factory.StartNew(() =>
{
MessageBox.Show(t.Id.ToString());
});
谁能解释一下为什么会这样?
最佳答案
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());
});
关于c# - Action 委托(delegate)中的任务实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11667892/