c# - 任务和线程不在 Linqpad 的静态构造函数中运行

标签 c# linqpad static-constructor

此代码在 t.Wait() 行无限期等待。

void Main()
{
    Foo.Bar();
}

public static class Foo
{
    static Foo()
    {
        var t = Task.Factory.StartNew (() => 1);
        t.Wait();
        "Done".Dump();
    }

    public static void Bar()
    {
    }
}

我希望任务立即运行并完成。关于为什么的任何想法?这似乎不会发生在实例构造函数中。 v4.42.01

最佳答案

代码的“StartNew-and-Wait”部分按预期工作(t.Result 将为 1), 如果你把它放到 MainBar 方法中。它不会停止 Wait-ing 仅当您将它放入静态构造函数时,因为“any operation that blocks the current thread in a static constructor potentially risks a deadlock”。

为了防止同时多次执行静态 ctors,CLR 在锁下执行它们。在这里,您尝试从 Foo 的静态构造函数调用 Foo 的匿名方法,并等待它完成,这会导致死锁。

相关 SO 页面:1 , 2

关于c# - 任务和线程不在 Linqpad 的静态构造函数中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11087494/

相关文章:

c# - 如何将数据从 WebBrowser 控件中的 JavaScript 返回到 C#?

c# - 如何使用 Emgu CV(或 OpenCV)剪切图像的子部分?

linqpad - 为什么.Dump(#)会使我的结果翻倍?

linqpad - 在 Linqpad 中重新运行查询之间会保存什么状态?

linqpad - LinqPad 中的 Linq 查询是只读的?

c# - C# 中静态构造函数不能有返回类型,但静态方法必须有返回类型

c# - 防止 TFS 添加临时文件

c# - 在引用任何静态成员之前调用静态构造函数

c# - 显式调用静态构造函数

c# - WebClient.UploadString 方法的最大数据长度