Multithreading 告诉我';经过时间';事件线程是否仍在运行?

Multithreading 告诉我';经过时间';事件线程是否仍在运行?,multithreading,timer,Multithreading,Timer,给定System.Timers.Timer,主线程是否有办法判断运行已用事件代码的工作线程是否仍在运行 换句话说,在停止计时器或计时器运行的主应用程序/服务线程之前,如何确保工作线程中运行的代码当前未运行 这是一个为线程计时器使用状态而丢弃计时器的问题,还是只是直接使用线程的时间问题?对于开箱即用的解决方案,没有办法。主要原因是运行TimerCallback函数的线程很可能仍然处于活动状态,即使运行回调的代码已经完成。TimerCallback由线程池外的线程执行。当任务完成时,线程不会死亡,而

给定System.Timers.Timer,主线程是否有办法判断运行已用事件代码的工作线程是否仍在运行

换句话说,在停止计时器或计时器运行的主应用程序/服务线程之前,如何确保工作线程中运行的代码当前未运行


这是一个为线程计时器使用状态而丢弃计时器的问题,还是只是直接使用线程的时间问题?

对于开箱即用的解决方案,没有办法。主要原因是运行TimerCallback函数的线程很可能仍然处于活动状态,即使运行回调的代码已经完成。TimerCallback由线程池外的线程执行。当任务完成时,线程不会死亡,而是返回到下一个线程池任务的队列中

为了让它工作,您必须使用线程安全的信号方式来检测操作是否已完成


对于开箱即用的解决方案,没有办法。主要原因是运行TimerCallback函数的线程很可能仍然处于活动状态,即使运行回调的代码已经完成。TimerCallback由线程池外的线程执行。当任务完成时,线程不会死亡,而是返回到下一个线程池任务的队列中

为了让它工作,您必须使用线程安全的信号方式来检测操作是否已完成


查找手册重置事件,因为它专门用于执行您要求的操作

线程创建一个新的重置事件,并将其添加到一个可访问的队列中,主线程可以使用该队列查看是否有线程仍在运行

// main thread owns this
private List<ManualResetEvent> _resetEvents;
...
// main thread does this to wait for executing threads to finish
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false)
...
// worker threads do this to signal the thread is done
myResetEvent.Set();

查找ManualResetEvent,因为它专门用于执行您要求的操作

线程创建一个新的重置事件,并将其添加到一个可访问的队列中,主线程可以使用该队列查看是否有线程仍在运行

// main thread owns this
private List<ManualResetEvent> _resetEvents;
...
// main thread does this to wait for executing threads to finish
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false)
...
// worker threads do this to signal the thread is done
myResetEvent.Set();