gpt4 book ai didi

c# - 可以将线程存储在静态变量中吗?

转载 作者:行者123 更新时间:2023-11-30 22:02:33 25 4
gpt4 key购买 nike

我想确保我总是只创建一个 Thread 实例,所以我构建了这个:

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)。为避免我调用外部系统两次,我创建了静态变量,以便我可以检查当前是否正在进行调用。

最佳答案

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

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

考虑切换到 Task .它更现代。减少陷阱。

考虑使用 Lazy<Task>创建您想要的单例行为。

添加错误处理。后台线程中的崩溃会终止进程,而不会将错误通知开发人员。

关于c# - 可以将线程存储在静态变量中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26802972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com