你可以做這樣的事情。我還不能肯定知道這是多麼好:
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
應有些魯莽。除此之外,我無法想到它有什麼問題,但我卻對此置之不理。只是覺得有點哈克。
IDisposable接口沒有任何方法返回Task,因此應如何調用Dispose等待任務? –
這個問題與以前的問題有何不同:https://stackoverflow.com/questions/45205132/alternative-to-using-async-in-rx-finally? – VMAtm
@Peter也是我的理解。不知道是否有某種方法可以完成這個任務。 –