Disposable.Create需要一个Action作为参数。在释放Rx订阅时运行Action。
在处理Rx订阅时,我想运行一些异步清理代码,但是使用async () =>和Action是完全相同的,我想避免使用async void。有关我为什么要避免这种情况的更多细节,请参见这里。
是否可以创建类似于Disposable.AsyncCreate的东西,它接受Func<Task>而不是Action。如果是这样的话,我应该如何使用它作为CompositeDisposable的一部分
还是有其他处理异步处理的模式?
发布于 2017-07-25 14:11:49
你可以这样做。我还是不知道这个主意有多好:
public class DisposableAsync
{
private readonly IDisposable _disposable;
private readonly Func<Task> _asyncDisposalAction;
public DisposableAsync(IDisposable disposable, Func<Task> asyncDisposalAction)
{
_disposable = disposable;
_asyncDisposalAction = asyncDisposalAction;
}
public Task DisposeAsync()
{
_disposable.Dispose();
return _asyncDisposalAction();
}
}
public static class DisposableAsyncExtensions
{
public static DisposableAsync ToAsync(this IDisposable disposable, Func<Task> 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应该被注册。除此之外,我想不出它有什么问题,但我还是倾向于反对它。只是觉得有点无趣。
https://stackoverflow.com/questions/45286998
复制相似问题