Async Disposable.Create

Disposable.Create需要Action作为参数。 在处理Rx订阅时运行Action

在处理Rx订阅时,我想运行一些异步清理代码,但是使用带有Action async () =>async void相同,我想避免使用它。 有关我为什么要避免这种情况的详细信息,请参阅此处 。

是否可以创建类似Disposable.AsyncCreate东西,它接受Func而不是Action 。 如果是这样,我应该如何将它作为CompositeDisposable一部分使用?

还是有其他模式来处理异步处置?

你可以这样做。 我仍然不确定它有多好:

 public class DisposableAsync { private readonly IDisposable _disposable; private readonly Func _asyncDisposalAction; public DisposableAsync(IDisposable disposable, Func asyncDisposalAction) { _disposable = disposable; _asyncDisposalAction = asyncDisposalAction; } public Task DisposeAsync() { _disposable.Dispose(); return _asyncDisposalAction(); } } public static class DisposableAsyncExtensions { public static DisposableAsync ToAsync(this IDisposable disposable, Func asyncDisposalAction) { return new DisposableAsync(disposable, asyncDisposalAction); } } 

然后你可以像这样使用它:

 async Task Go() { var o = Observable.Interval(TimeSpan.FromMilliseconds(100)); var d = o .Subscribe(i => Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: {i}")) .ToAsync(async () => { Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: Dispose Beginning"); await Task.Delay(1000); Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: Dispose Complete"); }); Console.Read(); var t = d.DisposeAsync(); Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: Outside task, waiting for dispose to complete"); await t; Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: Task Complete"); } 

此解决方案不适用于using()语句,并且类DisposableAsync应该是有效的。 除此之外,我无法想到它有什么不妥,但我倾向于(ahem)反对它。 只是觉得有点hacky。

我不认为async () =>有你认为它的问题。

试试这个:

 Action x = async () => { try { Console.WriteLine("Hello"); await Task.Delay(TimeSpan.FromSeconds(2.0)); throw new Exception("Wait"); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine("Goodbye"); }; var d = Disposable.Create(x); d.Dispose(); 

它产生:

你好
等待
再见