ASP.NET中线程的奇怪行为
本文关键字:NET 线程 ASP | 更新日期: 2023-09-27 18:08:29
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
。
没有第三行。
当我在second log line
下写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
}
}