退出没有循环的线程
我需要一种方法来停止不包含循环的工作线程。应用程序启动该线程,然后该线程创建一个FileSystemWatcher对象和一个Timer对象。每个都有回调函数。
到目前为止我所做的是在线程类中添加一个volatile bool成员,并使用timer来检查这个值。一旦设置了这个值,我就挂断了如何退出线程。
protected override void OnStart(string[] args)
{
try
{
Watcher NewWatcher = new Watcher(...);
Thread WatcherThread = new Thread(NewWatcher.Watcher.Start);
WatcherThread.Start();
}
catch (Exception Ex)
{
...
}
}
public class Watcher
{
private volatile bool _StopThread;
public Watcher(string filePath)
{
this._FilePath = filePath;
this._LastException = null;
_StopThread = false;
TimerCallback timerFunc = new TimerCallback(OnThreadTimer);
_ThreadTimer = new Timer(timerFunc, null, 5000, 1000);
}
public void Start()
{
this.CreateFileWatch();
}
public void Stop()
{
_StopThread = true;
}
private void CreateFileWatch()
{
try
{
this._FileWatcher = new FileSystemWatcher();
this._FileWatcher.Path = Path.GetDirectoryName(FilePath);
this._FileWatcher.Filter = Path.GetFileName(FilePath);
this._FileWatcher.IncludeSubdirectories = false;
this._FileWatcher.NotifyFilter = NotifyFilters.LastWrite;
this._FileWatcher.Changed += new FileSystemEventHandler(OnFileChanged);
...
this._FileWatcher.EnableRaisingEvents = true;
}
catch (Exception ex)
{
...
}
}
private void OnThreadTimer(object source)
{
if (_StopThread)
{
_ThreadTimer.Dispose();
_FileWatcher.Dispose();
// Exit Thread Here (?)
}
}
...
}
因此,当线程被告知停止时,我可以处理Timer / FileWatcher - 但是我如何实际退出/停止线程?
没有找到相关结果
已邀请:
6 个回复
骨酚柯
而不是布尔标志。线程启动
,然后等待事件。当调用
时,它会设置事件:
这可以防止您必须使用计时器,并且您仍然可以收到所有通知。
逆捐凶撤小
方法退出时,线程将退出。当你到达计时器时,它已经消失了。
委婪绷冗诉
中止线程。这在很大程度上被认为是一个非常危险的操作,因为它将有效地抛出异常并使用它来退出线程。如果代码没有得到充分的准备,这很容易导致泄漏的资源或永远锁定的互斥锁。我会避免这种做法 检查指定位置的
值,并返回方法或抛出异常以返回到线程开始并从那里优雅地退出线程。这是TPL代码库(取消令牌)所青睐的方法
闪票仇门韧
靛新比比催
舜辉