gpt4 book ai didi

c# - 静态初始化器中的 Task.Run

转载 作者:可可西里 更新时间:2023-11-01 08:08:46 24 4
gpt4 key购买 nike

考虑以下代码。

static class X
{
public static int Value = Task.Run(() => 0).Result;
}

class Program
{
static void Main(string[] args)
{
var value = X.Value;
}
}

调用 Task.Run 然后在静态初始化程序中调用 Result 会导致程序永久卡住。为什么?

最佳答案

您在 CLR 的类初始化锁上看到了死锁。

基本上,课上什么都没有X可以在类初始化之前使用。但是你的匿名方法() => 0被编译为该类的成员。在 Task 之前,类初始化不会完成可以完成,但是 Task无法完成,因为它依赖于在类初始化完成之前不允许运行的方法。

死锁。

您的示例显然是人为设计的,因此无法就如何解决您的实际问题提供建议。在此特定示例中,您可以将初始化替换为 Task.FromResult(0).Result;但这当然更加做作;如果那确实可用,您只需分配 0到现场。

但是无论您的真实场景是什么,解决它的方法是不要造成类的初始化依赖于某些需要该类才能完成的外部组件的情况。例如,您可能会考虑使用 Lazy<T>初始化值,或直接调用方法(这是允许的)。

无论示例是否人为设计,启动 Task 都没有任何意义只是立即阻塞当前线程直到它完成。因此,如果您有任何代码,虽然在字面上与此示例不完全相同,但仍然有效地执行相同的操作,那么显而易见的解决方法是将其更改为以串行、单线程方式执行。

关于c# - 静态初始化器中的 Task.Run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612772/

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