在同步世界中,C#使所有事物的管理变得非常容易:
using(IDisposable someDisposable=bla.bla())
{
//do our bidding
}
//don't worry too much about it
但是,当我们进行异步时,我们不再具有using
块的便利性。我遇到的最好的策略之一是CCR iterator,它允许我们使用异步代码“就好像它是同步的”。这意味着我们可以将using
块保留在迭代器处理程序中,而不会在何时处理和捕获需要处理的所有情况的复杂决策中陷入困境。
然而,在许多情况下,调用CCR看起来有点矫枉过正,说实话,虽然我对CCR很满意,但对于初学者来说它看起来像双荷兰。
所以我的问题是:当一次性物品必须超出直接范围时,管理一个人的IDisposable还有哪些其他策略?
答案 0 :(得分:1)
一种方法是让所有无法与处理方法共存的方法在运行时锁定,并在完成时检查队列中是否有需要处理的对象。然后处理方法可以将自己添加到队列中,使用TryEnter尝试获取锁,处理对象并在成功时将其从队列中删除,或者让当前的锁持有者处理。
答案 1 :(得分:0)
事实证明,这个问题也出现在语言设计师的脑海中。
此问题的正确答案现在是使用基于Task
的异步API版本,这些版本几乎为所有异步操作提供,再加上新的C#async
/ {{1} }关键字。这些允许我们在异步操作的生命周期内保持一切范围:
await