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