lys*_*cid 12 c# multithreading
我有一个奇怪的问题:
在我的C#app中,我正在创建另一个线程,如下所示:
Thread printThread = new Thread(printWorker);
printThread.Name = "Logger MainThread";
printThread.IsBackground = true;
printThread.Start();
Run Code Online (Sandbox Code Playgroud)
当我的主线程完成时,这个新线程继续工作,虽然它被标记为背景.
可能是什么原因造成的?这个对象持有Mutex对象,不确定这可能是原因......
任何人的想法?
这是printWorker方法的代码:
while (loggerIsActive)
{
LogMessage log = LoggerQueue.Dequeue();
if (log.message != null)
{
syncLogObj.WaitOne();
lock (writerobj)
{
StreamWriter sw;
if (!File.Exists(fName))
{
sw = File.CreateText(fName);
}
else
{
sw = new StreamWriter(fName, true);
}
using (sw)
{
if (log.message != "")
{
if (log.message.EndsWith("\r\n"))
{
log.message =
log.message.Substring(0, log.message.Length - 2);
}
sw.WriteLine(string.Format("[{0}][{3}][{1}] | {2}",
log.msgTime,
log.level.ToString(),
log.message,
log.sender.ToString()));
}
sw.Flush();
sw.Close();
}
}
syncLogObj.ReleaseMutex();
}
Thread.Sleep(5);
}
Run Code Online (Sandbox Code Playgroud)
Bor*_* B. 12
试试这个:
通过VS启动应用程序并正常退出.如您所述,VS应保持在调试模式.单击Pause按钮(全部中断),然后转到Debug-> Windows-> Threads.你在列表中看到了"Logger MainThread"吗?
否则,对于这些问题,通过System.Diagnostics.Debug.Print语句监视程序状态总是有用的(您可以在VS输出窗口中看到它们打印).
不漂亮.但这不是电视.继续阅读:
1)不确定您是否正在使用它,但看起来您应该在排队(主pgm)或出队(线程)之前锁定loggerqueue.
2)无需仅使用此设置锁定writerobj.但实际上你应该如此安全地在写入期间杀死线程:
如果你正确地这样做,你不应该使用Waits和互斥量.无论如何,如果你正在使用等待,你将不需要睡眠.
对此应用程序的一般建议:为什么不登录主线程?如果您的日志记录繁忙,则日志结果将毫无用处.
但是在极少数情况下这可能是错误的.Entonces ......
有线程的一般建议可以解决这个问题:
| 归档时间: |
|
| 查看次数: |
8548 次 |
| 最近记录: |