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();
它产生:
你好 等待 再见