如何解决没有同步处理可用时,如何处理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));
}
}
}
}
我面临的问题是,对于Idisposable
和IdisposableAsync
的实现与否,我有点困惑。根据{{3}}:
但是在MSDN示例中,Utf8JsonWriter
实现了Idisposable
和IdisposableAsync
方法,这使得这些接口在示例中易于实现。
就我而言,我没有同步清理操作。我不想执行这样的操作,因为我不希望Close
操作在当前操作实际完成之前返回。
因此,仅实施IdisposableAsync
可以吗?
或者我应该实现一个同步Close
方法(仅调用_myObject.AbortLongTask();
,或者可能使用丑陋的Thread.Sleep()
而不是Task.Delay()
)并同时实现{{1 }}和Idisposable
?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。