Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态变量是否在任何特定线程中初始化?_C#_Windows - Fatal编程技术网

C# 静态变量是否在任何特定线程中初始化?

C# 静态变量是否在任何特定线程中初始化?,c#,windows,C#,Windows,我在做一些受启发的研究,我注意到一些针对类似问题提出的解决方案在静态变量初始化期间创建了互斥对象。只有在创建互斥锁的线程在应用程序的生命周期内保持活动状态时,这种互斥锁才会根据需要工作 现在,静态变量由进程主线程初始化似乎是合理的猜测,而进程主线程仅在主函数退出时才退出(可能是在程序员的控制下)似乎也是合理的猜测 但是这两种语言中的任何一种都是由C语言标准保证的吗 PS:我说的是Windows线程,而不是.NET线程。在C#中,静态变量在第一次加载类时由类加载器初始化。这有一个有趣的工件,它位于

我在做一些受启发的研究,我注意到一些针对类似问题提出的解决方案在静态变量初始化期间创建了互斥对象。只有在创建互斥锁的线程在应用程序的生命周期内保持活动状态时,这种互斥锁才会根据需要工作

现在,静态变量由进程主线程初始化似乎是合理的猜测,而进程主线程仅在主函数退出时才退出(可能是在程序员的控制下)似乎也是合理的猜测

但是这两种语言中的任何一种都是由C语言标准保证的吗

PS:我说的是Windows线程,而不是.NET线程。

在C#中,静态变量在第一次加载类时由类加载器初始化。这有一个有趣的工件,它位于第一次引用该类的任何线程上


我们还注意到,不能保证主线程是托管线程,因此不能保证主线程之后的任何库都能够识别它。我曾经写过一个程序,在本机初始化后没有主线程,只是为了证明它可以完成。

你关于线程的假设是不对的。主线程可以在其他线程完成之前退出。有一个关于它的问题。@GolezTrol:谢谢。我认为在这种情况下,这本身并不是致命的,因为在那个例子中,主线程的退出仅仅是因为主函数的退出。这是在程序员的控制之下,因此我们可以简单地断言,在释放互斥对象没有问题之前,程序员负责不退出主函数。但它仍然存在这样一个问题:语言标准是否确保主线程在主函数退出之前不会退出。(问题相应更新)如我所怀疑;谢谢进一步阅读表明,我不应该考虑主线程,而应该考虑UI线程;因此,如果您有时间快速查看,并让我知道我是否犯了任何明显、可怕的错误,我将不胜感激。:-)UI线程是另一个误称。您可以有N个UI线程,其中0>=N>(巨大的数字)。我指的是由
Application.Current.Dispatcher
指定的线程;这是一个常数,不是吗?我想把它称为“主UI线程”,但所有的文档似乎都把它称为“UI线程”,所以我想我应该坚持下去……我对WPF一无所知。我只知道我制作的程序主UI线程毫无意义(多个顶级窗口)。是的,我认为即使在WPF中也可以没有主UI线程。我不认为所有的.NET应用程序都有一个通用的解决方案,但是在这个特定问题的上下文中,希望
Application.Current.Dispatcher
就可以了。