gpt4 book ai didi

.net - 在 WaitAsync 时处理一个 SemaphoreSlim

转载 作者:行者123 更新时间:2023-12-05 07:53:58 31 4
gpt4 key购买 nike

SemaphoreSlim 的文档说“只有在所有其他操作都已完成时才应使用 Dispose”。

应该如何调整以下类,以便线程 B 可以在线程 A 等待 Async() 时调用 Dispose()。调用 Dispose() 时,Async() 必须抛出 ObjectDisposedException。

class A
{
SemaphoreSlim _sem = new SemaphoreSlim(0);
public Task Async() { return _sem.WaitAsync(); }
public void Dispose() { _sem.Dispose(); }
}

最佳答案

How should the following class be adjusted so thread B can call Dispose() while thread A is awaiting Async()

不应该。正如您引用的文档所说,如果所有操作均未完成,则不应调用 Dispose() 。如果有线程仍在等待 WaitAsync(),则该操作未完成,因此不应调用 Dispose()

来自评论:

Dispose is called as a means of cancelling all pending requests and releasing resources.

这是一种不明智的取消请求的方式。

当然,如果您执行某些操作将对象置于无效状态,它可能会导致其他线程发生异常,从而可能导致它们中止并因此放弃它们的工作。

但不能保证他们应该这样做,而且也很有可能对它们进行编码,以免在这种情况下出现此类异常并进行适当清理。

如果要取消,请进行正常取消。这样创建任务:

public Task Async(CancellationToken cancellationToken)
{
return _sem.WaitAsync(cancellationToken);
}

并使用cancellationToken取消。

关于.net - 在 WaitAsync 时处理一个 SemaphoreSlim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32035891/

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