gpt4 book ai didi

c# - 如何向应用程序添加暂停/恢复功能?

转载 作者:太空狗 更新时间:2023-10-29 21:29:49 27 4
gpt4 key购买 nike

我正在编写一个应用程序,其中大部分工作由后台线程(10 - 500 个线程)完成。

我想添加暂停/恢复功能。

以前,您可以使用 Thread.Suspend 和 Thread.Resume 来做到这一点。但这些功能现在被认为已过时。

有什么能让我同样轻松地做同样的事情吗?

我正在用 C# 编写软件

最佳答案

在用 C# 编写了一个高性能爬虫之后,我可以权威地说,显式管理数十个或数百个线程并不是最好的方法。可以做到(我做到了),但是非常痛苦。

就是说。 . .

如果你的应用程序是按照我的想法写的,那么每个线程都会做这样的事情:

while (!Shutdown)
{
// get next url to crawl from somewhere
// download the data from that url
// do something with the data
}

在下载之间暂停线程非常简单。我建议创建两个 ManualResetEvent 实例:一个用于继续,一个用于关闭。这些是静态的,因此所有爬虫线程都可以访问它们:

static ManualResetEvent ShutdownEvent = new ManualResetEvent(false);
static ManualResetEvent ContinueEvent = new ManualResetEvent(true);

然后,每个线程在循环中使用WaitAny:

WaitHandle[] handles = new WaitHandle[] { ShutdownEvent, ContinueEvent };
while (true)
{
int handle = WaitHandle.WaitAny(handles); // wait for one of the events
if (handle == -1 || handle >= handles.Length)
{
throw new ApplicationException();
}

if (handles[handle] = ShutdownEvent)
break; // shutdown was signaled

if (handles[handle] == ContinueEvent)
{
// download the next page and do something with the data
}
}

请注意,当我定义handles 数组时,我首先指定了ShutdownEvent。原因是,如果多个项目被发出信号,WaitAny 返回对应于被发出信号的对象的最低索引。如果阵列以其他顺序填充,那么您将无法在不先暂停的情况下关闭。

现在,如果您希望线程关闭,请调用 ShutdownEvent.Set。如果您希望线程暂停,请调用 ContinueEvent.Reset 当您希望线程恢复时,请调用 ContinueEvent.Set

在下载过程中暂停有点困难。可以这样做,但问题是如果暂停时间过长,服务器可能会超时。然后你必须从头开始重新下载,或者,如果服务器和你的代码支持它,从你停止的地方重新开始下载。这两种选择都相当痛苦,所以我不建议尝试在下载过程中暂停。

关于c# - 如何向应用程序添加暂停/恢复功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7715438/

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