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
下编写second log line
循环时,
while(EmailThread.ThreadState.ToString()=="Running")
{
WriteToLog("Thread running");
}
变成无限循环。我不得不停止IIS。
这是一种奇怪的行为吗?
Apple
内的所有功能似乎都不起作用。
但是线程状态正在运行..
我失败了。有什么想法吗?还是因为新线程,它无法写入日志文件?相同的日志文件?但我已经尝试了2个不同的日志文件。它还没有用......
我在Apple
开头编写了写入日志文件的函数。
答案 0 :(得分:1)
日志记录机制是多线程的吗?
我建议你在你的代码中添加一个关键部分,以确保一次只能从一个线程发生日志记录,否则它们可能会刷新缓冲区或覆盖输出或类似的有趣内容。
为此,请执行以下操作:
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
}
}