【发布时间】:2014-07-17 12:23:30
【问题描述】:
我正在编写一个使用单独线程进行日志记录的应用程序。 当主线程停止时,我想停止单独的线程。但是我无法弄清楚何时停止记录器线程,因为我不知道主线程何时停止。 C# 中是否有一种机制可以在主线程停止时发送通知? (或者你能想出另一种解决我问题的方法吗?)
// This class automatically applies on each call of every method of Main() function
public class CommandLoggingAdvice : IMethodInterceptor
{
private static ProducerConsumerClass LoggingQueue = ProducerConsumerClass.Instance;
LoggingQueue.AddTask("Logging message on call of *method*");
}
public sealed class ProducerConsumerClass
{
// here Iget an instance of log4net
private ILog _Logger = null;
protected ILog Logger
{
_Logger = LogManager.GetLogger("Logger1");
}
private BlockingCollection<string> tasks = new BlockingCollection<string>();
private static volatile ProducerConsumerClass _instance;
Thread worker;
private Thread mainthread;
private ProducerConsumerClass()
{
mainthread = Thread.CurrentThread;
worker = new Thread(Work);
worker.Name = "Queue thread";
worker.IsBackground = false;
worker.Start(mainthread);
}
public static ProducerConsumerClass Instance
{
get
{
if (_instance == null)
{
_instance = new ProducerConsumerClass();
}
}
}
public void AddTask(string task)
{
tasks.Add(task);
}
void Work(object mainthread)
{
Thread ma = (Thread) mainthread;
if(ma.ThreadState != ThreadState.Stopped)
{
tasks.CompleteAdding();
}
while (true)
{
string task = null;
if (!tasks.IsCompleted)
{
task = tasks.Take();
Logger1.Info(task);
}
else
{
return;
}
}
}
}
如果 BlockingCollection 为空且应用程序仍在工作,则循环再调用一次 Take(),结果:记录器线程现在已暂停。所以当 main thread.Threadstate == Stopped 时,我需要杀死 logger 线程
在 cmets 中添加了有关问题的更多信息
【问题讨论】:
-
“你的”线程是主线程运行的同一个应用程序的一部分吗?
-
对,没错,而且IsBackground = false
-
你的主线程究竟是如何终止的?
-
像往常一样...所有工作都完成了,我调用 return 0;
-
请添加显示您如何启动后台线程的代码。这个问题听起来也很像stackoverflow.com/questions/1368697/…
标签: c# multithreading spring-aop spring.net thread-synchronization