gpt4 book ai didi

c# - 我可以查明是否没有线程在等待信号量吗?

转载 作者:行者123 更新时间:2023-11-30 17:04:02 25 4
gpt4 key购买 nike

我的应用程序处理许多同时下载。我当时只允许 3 个下载线程运行,其他下载排队等待信号量。

代码:

private static Semaphore semPool = new Semaphore(3, 3);
private static CancellationTokenSource cts = new CancellationTokenSource();

X 等待运行的下载数:

semPool.WaitOne();
DownloadItem d = new DownloadItem(fileInfo, cts.Token, launchAfterDownload);
//wait for download to be complete
semPool.Release()

现在,我希望能够有一种方法来取消所有下载。我通过将 cts.Token 设置为已取消来执行此操作,但我想在取消所有当前(和等待)下载时重置 cts.Token。

也就是我想等到semPool有3个单位

public static void CancelAllDownloads()
{
cts.Cancel();
//wait until semPool has 3
cts = new CancellationTokenSource();
}

如果我像现在这样调用 CancelAllDownloads(),正在运行的 3 个下载将被取消,但等待的下载将运行,因为取消 token 已重置。我也希望所有等待的都被取消,然后重置取消 token 。

最佳答案

你可以做的是使用 SemaphoreSlim改为上课。

此类具有您要求的功能,使用它您可以取消所有当前正在运行和等待的下载进程。代码将类似于:

private static SemaphoreSlim semPool = new SemaphoreSlim(3, 3);

semPool.Wait(cts.Token);

public static void CancelAllDownloads()
{
cts.Cancel();
cts = new CancellationTokenSource();
}

关于c# - 我可以查明是否没有线程在等待信号量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17989169/

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