首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步Disposable.Create

异步Disposable.Create
EN

Stack Overflow用户
提问于 2017-07-24 17:52:25
回答 1查看 1.9K关注 0票数 6

Disposable.Create需要一个Action作为参数。在释放Rx订阅时运行Action

在处理Rx订阅时,我想运行一些异步清理代码,但是使用async () =>Action是完全相同的,我想避免使用async void。有关我为什么要避免这种情况的更多细节,请参见这里

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-25 14:11:49

你可以这样做。我还是不知道这个主意有多好:

代码语言:javascript
复制
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);
    }
}

然后,您可以这样使用它:

代码语言:javascript
复制
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应该被注册。除此之外,我想不出它有什么问题,但我还是倾向于反对它。只是觉得有点无趣。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45286998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档