.net - 在 WaitAsync 时处理一个 SemaphoreSlim

标签 .net multithreading semaphore dispose idisposable

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/

相关文章:

c# - (反)序列化类似于 Microsoft 的已知类型

c# - 一个或两个 MVC 项目?

c++ - 使用 boost :thread 的可运行类

java - 作为kafka消费者同时消费多个主题

c++ - C 中信号量的使用?

c - 信号量队列

c - 链接器找不到信号量函数

.net - 如何在 .NET 框架的 csv 类型文件中存储和检索 exception.ToString() 值?

.net - 添加类型变化 : -MemberType vs. -TypeDefinition 参数

java - 使用Java多线程计算常数e