[英]Strange behaviour for threads in ASP.NET
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
内部的所有功能似乎也不起作用。
但是线程状态正在运行。
我迷路了。 任何想法?
还是由于新线程而无法写入日志文件? 相同的日志文件? 但我已经尝试了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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.