gpt4 book ai didi

c# - 优雅地关闭线程

转载 作者:太空狗 更新时间:2023-10-29 20:59:31 25 4
gpt4 key购买 nike

在我正在开发的一个应用程序中,我有一个简单地放置在那里并显示日志数据的主窗体,以及一个在循环中自主执行工作的工作线程。

MyWorker worker = new MyWorker();
MainForm mainForm = new MainForm();

// Subscribe form to log event so log data gets displayed
worker.Log += mainForm.Log;

// Start the worker thread's MainLoop
new Thread(new ThreadStart(worker.MainLoop)).Start();

// Show the form (blocking)
Application.Run(mainForm);

// If we end up here, the form has been closed and the worker has to stop running
worker.Running = false;

如您所见,无论何时关闭表单,工作线程都应该停止。 worker 看起来像这样:

public class MyWorker
{
public String Running { get; set; }

public MyWorker()
{
Running = true;
}

public void MainLoop()
{

while (Running)
{

DoExtensiveWork1();
if (!Running) return;

DoExtensiveWork2();
if (!Running) return;

DoExtensiveWork3();
if (!Running) return;

DoExtensiveWork4();
if (!Running) return;

DoExtensiveWork5();
if (!Running) return;

// We have to wait fifteen minutes (900 seconds)
// before another "run" can be processed
for (int i = 0; i < 900; i++)
{
Thread.Sleep(1000);
if (!Running) return;
}
}
}
}

如您所见,我希望线程能够在连续的工作操作之间切换时停止,但在一个操作中不能。当操作 (DoExtensiveWorkN) 完成时,其状态和结果会保存在磁盘或数据库中,因此在操作正在进行时退出(例如,通过 Thread.Abort)不是一种选择。

但是,我发现我刚刚编写的这段代码令人反感,尤其是“等待循环”,它休眠一秒 900 次,以防止线程在检测到 Running 之前空闲 15 分钟。已设置为 false .

我宁愿能够在完成一项工作后立即抛出某种事件来停止主循环。

任何人都可以指出正确的方向如何做到这一点,或者如果因为我完全误解了线程而需要完全重写,请告诉我在哪里解释了这些原则?

最佳答案

您可以显着整理各个任务的运行和 15 分钟的等待循环。

我建议也许使用这样的东西:

public class MyWorker
{
private readonly ManualResetEvent _stopEvent = new ManualResetEvent(false);
private readonly Action[] _workUnits;

private bool Running
{
get { return !_stopEvent.WaitOne(0); }
}

public MyWorker()
{
_workUnits = new Action[]
{
DoExtensiveWork1,
DoExtensiveWork2,
DoExtensiveWork3,
DoExtensiveWork4,
DoExtensiveWork5
};
}

public void Stop()
{
_stopEvent.Set();
}

public void MainLoop()
{

while (Running)
{
foreach (var workUnit in _workUnits)
{
workUnit();
if (!Running) return;
}

// We have to wait fifteen minutes (900 seconds)
// before another "run" can be processed
if (_stopEvent.WaitOne(900000)) return;
}
}
}

然后在下一个适当的点停止进程:

Worker.Stop();

关于c# - 优雅地关闭线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7834351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com