gpt4 book ai didi

c# - Action 委托(delegate)中的任务实例

转载 作者:行者123 更新时间:2023-11-30 14:35:43 26 4
gpt4 key购买 nike

我无法在下面的代码中直接在任务的操作委托(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com