Ear*_*ine 0 c# idisposable system.reactive
我很惊讶反应式扩展CompositeDisposable类未能通过以下测试
[Test]
public void TestDisposable()
{
var ds = new List<IDisposable>();
int[] a = { 1, 2, 3 };
using (new CompositeDisposable(ds))
{
ds.Add(Disposable.Create(() => a[0] = 3));
ds.Add(Disposable.Create(() => a[2] = 1));
}
Assert.That(a[0],Is.EqualTo(3)); //Failed here
Assert.That(a[1], Is.EqualTo(2));
Assert.That(a[2], Is.EqualTo(1));
}
Run Code Online (Sandbox Code Playgroud)
所以这意味着如果我CompositeDisposable通过给定 a创建 aIEnumerable<IDisposable>它实际上迭代它的所有元素,而不是将其推迟到Dispose被调用者。
这在其他情况下可能很有用,但在我的情况下却很不方便。是否还有其他课程可以更轻松地完成上述任务?
的构造函数CompositeDisposable将复制您的列表。因此,当您之后将元素添加到列表时,它们将不会被CompositeDisposable.
这是一个简单的解决方案:
using (var composite = new CompositeDisposable())
{
composite.Add(Disposable.Create(() => a[0] = 3));
composite.Add(Disposable.Create(() => a[2] = 1));
}
Run Code Online (Sandbox Code Playgroud)
或者,如果这不方便,这里有一个解决方法:
public static IDisposable AsLazyComposite(this IEnumerable<IDisposable> sequence)
{
return Disposable.Create(() =>
{
foreach (var disposable in sequence)
disposable.Dispose();
});
}
Run Code Online (Sandbox Code Playgroud)
用法:
using (ds.AsLazyComposite())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |