2011-09-13 64 views
2
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 
} 

在日志文件中,我得到了第一行和第二行。但我无法获得第三条线。ASP.NET中线程的奇怪行为

我可以得到第三行,如果我只是简单地调用Apple函数。第一行是Unstarted,第二行是running

没有第三条线。

当我写下 second log line while

while(EmailThread.ThreadState.ToString()=="Running") 
{ 
    WriteToLog("Thread running"); 
} 

变成无限循环。我不得不停止IIS。

这是一种奇怪的行为?

Apple内的所有功能似乎也不工作。

但线程状态运行..

我迷路了。任何想法?

还是因为新的线程,它不能写入日志文件?相同的日志文件?但我已经尝试了2个不同的日志文件。它仍然没有工作...

和我写的函数写入日志文件在Apple开始。

+2

:把它定义为一个字段的类像这样?你似乎缺乏对如何编写多线程代码的理解,这是我相信你不需要它的一个很好的理由。 ASP.NET有它自己的线程池,并将有效地为你传入多个请求。你不必亲自去做。 – x0n

+0

这不是我正在使用的线程..但我纠正的代码是使用线程.. – william

+0

你使用什么日志?可能会出现一些文件锁定,这些锁定无法从您提供的代码中看到。显示实际写入日志代码,因为我很确定Thread.Start()正在工作 –

回答

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

没有有几个线程,我从来没有碰..这意味着这些线程不具有写入日志功能..他们从来没有工作.. – william

+0

@william让我知道如果这帮助任何。 –