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/