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的开始

ASP.NET中线程的奇怪行为

日志机制是多线程的吗?

我建议你在代码中添加一个临界区,以确保日志记录一次只发生在一个线程中,否则它们可能会刷新缓冲区或覆盖输出或诸如此类的有趣的事情。

要做到这一点,实现如下:

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 
  } 
}