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

标签 c# .net task-parallel-library

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

相关文章:

c# - 是否可以在 C# 中继承数据注释?

c# - 我可以强制子类声明一个常量吗?

.net - Getdate() 函数返回的结果与 dotnet 中的 DateTime.Now 不同

c# - 如何在C#中使用TPL实现异步文件下载

c# - System.Numerics 是一个单独的程序集的原因

c# - 使用参数安全调用多次调用泛型方法(运行时返回类型)的最佳方法

c# - 长时间运行的线程或任务

c# - 在数据流 block 中应用 CancellationToken

c# - 对于 i = 0,为什么 (i += i++) 等于 0?

.net - 当 Windows 窗体应用程序正常时,无法从控制台应用程序创建 COM 对象