public void WriteToLog(string Msg)
{
//Write to Log
}
public static void Apple()
{
WriteToLog("Apple Started"); // third log line
}
public void CallFunction()
{
Thread EmailThread = new Thread(new ThreadStart(Apple));
WriteToLog(EmailThread.ThreadState.ToString()); // first log line
EmailThread.Start();
WriteToLog(EmailThread.ThreadState.ToString()); // second log line
}
在日志文件中,我得到第一行和第二行。但我无法获得第三行。
如果我简单地调用 Apple
函数,我可以获得第三行。
第一行是Unstarted
,第二行是running
。
没有第三行。
当我在第二行
下编写while
循环时,
while(EmailThread.ThreadState.ToString()=="Running")
{
WriteToLog("Thread running");
}
变成无限循环。我不得不停止 IIS。
这是一种奇怪的行为吗?
Apple
中的所有功能似乎也无法正常工作。
但是线程状态是running..
我迷路了。有什么想法吗?
还是因为新的线程,它不能写入日志文件?同一个日志文件?但我已经尝试了 2 个不同的日志文件。还是不行。。。
我在 Apple
的开头编写了写入日志文件的函数。
最佳答案
日志机制是多线程的吗?
我建议您在代码中添加一个关键部分,以确保一次只从一个线程进行日志记录,否则它们可能会刷新缓冲区或覆盖输出或诸如此类的有趣事情。
要执行此操作,请执行以下操作:
static readonly object threadLock = new object();
public void WriteToLog(string Msg)
{
lock(threadLock)
{
//Write to Log
}
}
希望对您有所帮助。
已更新
另外,我会尽量不让线程成为局部变量。它有可能在它的代码执行之前就已经完成了。像这样将其定义为类中的一个字段:
public class SomeClass
{
private Thread EmailThread;
public void WriteToLog(string Msg)
{
//Write to Log
}
public static void Apple()
{
WriteToLog("Apple Started"); // third log line
}
public void CallFunction()
{
EmailThread = new Thread(new ThreadStart(Apple));
WriteToLog(EmailThread.ThreadState.ToString()); // first log line
EmailThread.Start();
WriteToLog(EmailThread.ThreadState.ToString()); // second log line
}
}
关于c# - ASP.NET 中线程的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7396282/