C# 静态构造函数中的线程不能立即工作

C# 静态构造函数中的线程不能立即工作,c#,C#,我有一个静态线程,负责从远程api获取和更新令牌。我想在静态构造函数中启动该线程,如下所示 using System; using System.Threading; namespace StaticConstructor { public class CallBack { static string _token = "init"; static Thread _threadUpdateToken; static CallBac

我有一个静态线程,负责从远程api获取和更新令牌。我想在静态构造函数中启动该线程,如下所示

using System;
using System.Threading;

namespace StaticConstructor
{
    public class CallBack
    {
        static string _token = "init";
        static Thread _threadUpdateToken;
        static CallBack()
        {
            _threadUpdateToken = new Thread(()=>
            {
                int i = 0;
                while (i < 3)
                {
                    GetTokenFromAPI();
                    Thread.Sleep(1 * 1000);
                    i++;
                }
            });
            _threadUpdateToken.Start();
            Console.WriteLine($"After thread start {DateTime.Now.ToString("hh:mm:ss")}");
            Thread.Sleep(10 * 1000);
            Console.WriteLine($"Static constructor keep running at {DateTime.Now.ToString("hh:mm:ss")}");
            Console.WriteLine($"token = {_token}");
        }

        public static void GetTokenFromAPI()
        {
            //this is for demo purpose
            var rd = new Random();
            _token = rd.Next().ToString();
            Console.WriteLine($"token has been updated as {_token} at {DateTime.Now.ToString("hh:mm:ss")}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            CallBack cb = new CallBack();
            Console.ReadKey();
        }
    }
}
那么我的问题是:
1。为什么thread\u threadUpdateToken在静态构造函数完成之前不启动?这是因为静态构造函数必须在其他线程访问静态变量之前完成吗?
2。如果我不想在静态构造函数中直接调用GetTokenFromAPI(),我该怎么办

static CallBack()
        {
            GetTokenFromAPI();
        }
从:

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数初始化类


因此,这里发生的事情是,线程将一直运行到它试图调用
GetTokenFromAPI
static方法的点,等待静态构造函数结束,然后继续运行。

关于第一个问题,线程不会立即旋转,事实上,这一切都有点做作,可能比我知道的多一点。这就是我添加Thread.Sleep()的原因。即使您如何设置线程的优先级,它也不会启动。@一般来说,这与线程快速旋转无关,取决于静态构造函数的工作方式。我同意这个代码有点臭。@DavidG啊,是的,我明白你的意思,很好point@DavidG你能给我一些建议吗?
static CallBack()
        {
            GetTokenFromAPI();
        }