首页 > 解决方案 > System.Threading.ThreadStateException(可能是引发条件)

问题描述

首先,我想描述一下我的问题所涉及的类/方法的一般结构。我有一个应该循环启动线程的类。该线程处理将日志条目写入日志文件的函数。我通过计时器 ( System.Threading.Timer) 实现了这一点。此外,还有一个 ThreadHandler 类,它将所有线程保存在一个列表中。这些线程由线程名称的标准函数控制System.Threading.Thread。现在到受我的问题影响的代码:

在我的 Log 类 ( LogWriter) 的构造函数中,我调用了该方法InitializeLoggerThread()

private void InitializeLoggerThread()
{
    LoggerLoggingThread = new System.Threading.Thread(new System.Threading.ThreadStart(WriteLog));
    LoggerLoggingThread.Name = LoggerLogginThreadName;
    ObjectObserver.ThreadHandler.AddThread(LoggerLoggingThread); // Obersver class from which all objects can be accessed
}

计时器本身将启动

public void StartLogging()
{
    this.LoggerTimer = new System.Threading.Timer(LoggerCallback, null, 1000, LoggerInterval);
}

此外,Log 类包含计时器的实现:

private const int LoggerInterval = 5000;
private System.Threading.Thread LoggerLoggingThread;
private static void LoggerCallback(object state)
{
    if ((BufferCount > 0))
    {
        ObjectObserver.ThreadHandler.StartThread(LoggerLogginThreadName);   
    }
}

ThreadHandler使用以下函数启动线程:

public void StartThread(string threadName)
{
    lock (Locker)
    {
        if (GetThread(threadName).ThreadState == ThreadState.Stopped || GetThread(threadName).ThreadState == ThreadState.Unstarted)
        {
            GetThread(threadName).Start();
        }
    }
}

我已经检查了参数等。在这种情况下一切都是正确的。基本上,在调试时,似乎所有线程都尝试同时启动记录器线程。

线程将通过它的名字被调用,函数如下:

public Thread GetThread(string threadName)
{
    foreach (Thread thread in Threads)
    {
        if (thread.Name == threadName)
        {
            return thread;
        }
    }
    return null;
}

现在我的问题是:我得到的构造中的错误是什么

System.Threading.ThreadStateException 在 StartThread(...)

在第一次执行后多次尝试执行?

如果需要,我可以提供所有重要功能的复制和粘贴代码以进行调试。

标签: c#multithreadingexceptionthread-safety

解决方案


线程通过一组状态(取自此处): 一旦线程完成,您将无法再次启动它。您的计时器函数尝试启动线程:
线程状态机
Stopped

if (GetThread(threadName).ThreadState == ThreadState.Stopped ...
    GetThread(threadName).Start();

.NET 中有很棒的日志框架,例如NLoglog4net,请不要尝试重新发明轮子,这些框架很可能已经可以满足您的需求,而且它们的效率更高。


推荐阅读