C# 关于单个可执行文件的多个实例中静态变量行为的问题

C# 关于单个可执行文件的多个实例中静态变量行为的问题,c#,C#,当一个应用程序并行执行多次时,该程序中静态声明的变量是分配到单个线程上还是在多个线程之间复制 我有一个例子,同一个程序并行执行 如果您的意思是您有多个正在执行的程序实例(即不同的进程;即您多次启动foo.exe),那么它们是完全独立的 如果您的意思是您有一个程序实例,它通过任何机制在内部使用并行线程:那么它们是完全共享的。。。通常 静态字段的正常范围是:应用程序域。这几乎总是意味着:过程 如果您的静态字段是不可变的(包括它们的任何子内容),那么:这真的不重要;为了提高效率,它们还可以共享只读不变

当一个应用程序并行执行多次时,该程序中静态声明的变量是分配到单个线程上还是在多个线程之间复制


我有一个例子,同一个程序并行执行

如果您的意思是您有多个正在执行的程序实例(即不同的进程;即您多次启动
foo.exe
),那么它们是完全独立的

如果您的意思是您有一个程序实例,它通过任何机制在内部使用并行线程:那么它们是完全共享的。。。通常

静态
字段的正常范围是:应用程序域。这几乎总是意味着:过程

如果您的
静态
字段是不可变的(包括它们的任何子内容),那么:这真的不重要;为了提高效率,它们还可以共享只读不变状态。但是如果你改变了值(包括改变任何子内容),那么它就会变得非常混乱。坦率地说,如果静态字段以任何方式(初始设置除外)发生了非平凡的变异,那么它可能不应该是静态字段


然而!还有
[ThreadStatic]
。如果
静态
字段标记为
[ThreadStatic]
,则范围为每个线程。这是。。。不是建议。特别是,它根本不适用于
async
/
wait
,因为您实际上无法控制继续运行的线程-这意味着您可能会无意中在逻辑状态之间切换,而没有意识到。坦率地说,在这个场景中,我的建议是创建一个表示每个线程或每个工作项状态的对象,并让每个线程使用它(也许worker方法可以是同一状态对象上的实例方法)。这非常容易操作,并且使调试和重构更加简单。

操作系统使用分离的内存运行进程。因此,如果使用分离的进程,那么就有不同的静态变量。在同一进程中,为所有线程分配一次静态变量


阅读IPC:

“同一程序正在并行执行”-一个exe实例有多个线程?或者多个exe实例,每个实例有一个主线程(与这些变量接触)?重要的是,静态变量是共享的,@GSerg在同一个exeHi中-我希望用一种更清晰的方式来重新表述你的问题,并归纳出有用的答案。我希望我的编辑反映了对您的问题的正确解释,您将得到所需的帮助。祝你有美好的一天!