C# 在静态变量中存储线程可以吗?

C# 在静态变量中存储线程可以吗?,c#,multithreading,C#,Multithreading,我希望确保始终只创建一个线程实例,因此我构建了以下内容: private static volatile Thread mdmFetchThread = null; private static object Locker = new object(); public void myMethod(){ string someParameter = getParameterDynamically(); lock(Locker) { // If an mdm

我希望确保始终只创建一个线程实例,因此我构建了以下内容:

private static volatile Thread mdmFetchThread = null;

private static object Locker = new object();

public void myMethod(){

    string someParameter = getParameterDynamically();

    lock(Locker)
    {

    // If an mdmFetchThread is already running, we do not start a new one.
    if(mdmFetchThread != null && mdmFetchThread.ThreadState != ThreadState.Stopped)
    {
       // warn...
    }
    else
    {
        mdmFetchThread = new Thread(() => { doStuff(someParameter); });
        mdmFetchThread.Start();
    }
    }
}
这样做可以吗?或者可能存在哪些陷阱


//编辑:根据下面的请求,一个位上下文:
doStuff()
正在调用某个外部系统。此呼叫可能会超时,但我无法指定超时。所以我在
mdmFetchThread
中调用它,然后执行一个
mdmFetchThread.join(20000)
。为了避免调用外部系统两次,我创建了静态变量,以便检查调用当前是否正在进行。

一般来说,如果使用静态存储状态(如线程),则在尝试向外扩展或尝试管理对象的生存期时,可能会出现设计缺陷。只要有可能,我通常会尽量避免使用静力学

另一种方法可能是创建一个只管理单个线程的类,以作为实例执行任务。此类可能负责将数据传递给线程或管理线程的状态。例如,确保它只运行一次,正常停止线程,或者在线程完成时进行处理。如果您想向外扩展,那么只需创建类的多个实例,每个实例都有自己管理的线程。如果您只需要一个,那么只需传递一个实例


如果您正在寻找使此实例可供整个应用程序使用的方法(这通常是人们在使用静态变量时试图解决的问题),那么请查看一些模式,如使用ServiceContainers和IServiceProvider

在静态变量中存储线程是可以的(如果每个AppDomain最多需要一个这样的线程)。您可以在静态存储中存储所需的任何内容

条件
mdmFetchThread.ThreadState!=ThreadState.Stopped
为快速。在线程退出前1纳秒,您可能会发现它为false。然后你不小心什么也没做。维护您自己的布尔状态变量并正确同步。放弃volatile,因为它比必要的复杂

考虑切换到
任务
。它更现代。减少陷阱

考虑使用
Lazy
创建所需的单例行为


添加错误处理。后台线程中的崩溃会在不通知开发人员错误的情况下终止进程。

假设您至少有可能从多个线程调用myMethod,则至少需要一个锁,以避免“线程是否存在”检查和“创建线程”之间可能发生的争用情况。这里最好使用哪种锁?不确定volatile是否合适,为什么不在类上使用静态构造函数来创建线程?我需要在运行时将数据传递给线程(doStuff()实际上更合适)。另外,所有这些都是作为接口实现的一部分发生的,我不能完全控制它,所以我只能做有限的事情//我在上面编辑了我的代码。你可以使用//编辑:刚刚意识到我不能使用
任务
,因为我在.NET 3.5上:/