微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

没有同步处理可用时,如何处理IAsyncDisposable和IDisposable接口?

如何解决没有同步处理可用时,如何处理IAsyncDisposable和IDisposable接口?

我正在围绕互操作对象编写一个Connection类。特别是,我的连接关闭是异步的。

我要连接的对象的API效果很差,例如:

public interface InteropObject
{
    void StartLongTask();
    void IsLongTaskInProgress();
    void AbortLongTask();
}

所有方法都会立即返回。

这是我最后得到的界面:

public interface IConnection
{
    // [..]
    Task OpenAsync();
    Task RunoperationAsync();
    Task CloseAsync();
    // [..]
}

以及以下实现:

public class Connection : IConnection
{
    private InteropObject _myObject;

    Task OpenAsync()
    { // some required stuff }
    
    async Task RunoperationAsync()
    {
        _myObject.StartLongTask()
        while(_myObject.IsLongTaskInProgress())
        {
            await Task.Delay(TimeSpan.FromSeconds(1));
        }
    }

    async ask CloseAsync()
    {
        if(_myObject.IsLongTaskInProgress())
        {
            _myObject.AbortLongTask();
            // because the abort is not immediate,I have to wait until the end
            while(_myObject.IsLongTaskInProgress())
            {
                await Task.Delay(TimeSpan.FromSeconds(1));
            }
        }
    }
}

我面临的问题是,对于IdisposableIdisposableAsync的实现与否,我有点困惑。根据{{​​3}}:

通常,在实现IAsyncdisposable接口时,类也会实现Idisposable接口。

但是在MSDN示例中,Utf8JsonWriter实现了IdisposableIdisposableAsync方法,这使得这些接口在示例中易于实现。

就我而言,我没有同步清理操作。我不想执行这样的操作,因为我不希望Close操作在当前操作实际完成之前返回。

因此,仅实施IdisposableAsync可以吗?

或者我应该实现一个同步Close方法(仅调用_myObject.AbortLongTask();,或者可能使用丑陋的Thread.Sleep()而不是Task.Delay())并同时实现{{1 }}和Idisposable

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。