gpt4 book ai didi

c# - 在静态构造函数中调用时,使用 Task.Run( ... ) 包装方法会挂起

转载 作者:太空狗 更新时间:2023-10-30 00:23:19 25 4
gpt4 key购买 nike

我有一系列长时间运行的函数。我想将它们包装在一个 Task 中,这样我就可以同时运行它们,而不是等待每个任务依次完成。

方法调用以及所有相关的字段值、方法和属性都存在于静态类中。

我遇到了一个问题,其中静态类构造函数无法完成,因为当我用 Task.Run 包装方法时它挂起。

符合必要条件Mininmal, Complete and Verifiable示例要求...

using System;
using System.Linq;
using System.Threading.Tasks;

namespace MCVEAsyncHang
{
class Program
{
private static readonly string[] _foo;

static Program()
{
_foo = Task.WhenAll(Task.Run(new Func<string>(One))).Result;
}

private static string One()
{
return "Foo";
}

private static void Print()
{
Console.WriteLine(
_foo.Aggregate((total, current) =>
total + string.Format("{0}{1}", Environment.NewLine, current)));
}

static void Main(string[] args)
{
Print();
Console.WriteLine("Done");
Console.ReadLine();
}
}
}

我知道我可以创建一些其他方法并调用它(如果必须的话,我会这样做(勉强如此))但如果可能的话,我宁愿将它保留在静态类构造函数中。

最佳答案

您的任务将在另一个线程中运行,需要调用 _one。在您的 Program 类型初始化之前,该方法无法执行。

任务的线程将看到 Program 类型已经在主线程中被初始化,因此将阻塞直到该线程完成类型的初始化。不幸的是,这不会发生——因为类型初始化器将阻塞直到你的任务完成。死锁。

基本上,您应该避免在静态构造函数中做太多工作。启动任务绝对感觉工作量太大。在这种情况下,死锁是显而易见的,但在其他情况下,它可能要微妙得多。 (在此之前,我花了 几个小时 来调试类型初始化器循环,这真的非常不好玩。那是单线程代码——我不敢想象在多线程环境中会有多痛苦.)

关于c# - 在静态构造函数中调用时,使用 Task.Run( ... ) 包装方法会挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41050798/

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