ASP.NET中线程的奇怪行为

时间:2011-09-13 02:46:12

标签: c# .net asp.net multithreading

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开头编写了写入日志文件的函数。

1 个答案:

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