c# - ASP.NET 中线程的奇怪行为

标签 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循环时,

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

关于c# - ASP.NET 中线程的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7396282/

相关文章:

.net - Visual Studio 2010 不显示其他已安装的框架

c# - 如何使用 .NET 运行时序列化识别放置在独立存储中的对象的版本?

.net - 我应该将配置文件放在 .NET 中的什么位置?

c# - 实体对象不能被 IEntityChangeTracker 的多个实例引用

c# - 为 Windows 服务指定 LoaderOptimization

c# - 在 Entity Framework Migration 中填写表格

c# - WCF 和 Entities Framework 延迟加载

c# - 将数据集 (.net) 中的列加载到字符串 [] 中的最佳方法是什么?

javascript - 如何禁用 jquery 选项卡中的显示效果?

c# - java不可见的环境变量