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

时间:2018-05-12 10:20:06

标签: c#

我有一个静态线程,它负责从远程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();
        }
    }
}

输出

After _threadUpdateToken.Start 05:16:15
Static constructor keeps running at 05:16:25
token = init
token has been updated as 1671358759 at 05:16:25
token has been updated as 437230378 at 05:16:26
token has been updated as 1350585644 at 05:16:27

然后我的问题是:
1。为什么线程_threadUpdateToken在静态构造函数完成之前无法启动?这是因为静态构造函数必须在任何其他线程访问静态变量之前完成吗?
2。如果我不想直接在静态构造函数中调用GetTokenFromAPI(),我该怎么办

static CallBack()
        {
            GetTokenFromAPI();
        }

1 个答案:

答案 0 :(得分:1)

来自C# docs

  

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

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