我读过this question但在我的情况下它更简单,因为我不必使用Result
属性。所以我想知道是否可以采用比斯蒂芬·克利里的答案更简单的方法。将任务转换为任务<T>(包装任务返回类型T)
假设我有这个简单的接口。
internal interface IBinaryDataReadable
{
Task Load(AsyncDataReader reader);
}
该接口提供方法异步加载对象。它不会返回任何东西,因为加载结果是对象本身。
(该接口是内部和为此实现明确地避免暴露实现)
这是我如何加载的二进制数据。
data = new BinaryData();
await ((IBinaryDataReadable)data).Load(reader);
我想使这个更流畅和详细,所以我写这扩展方法
internal static Task<TData> Load<TData>(this TData data, AsyncDataReader reader)
where TData : IBinaryDataReadable
=> data.Load(reader).ContinueWith(t => data, TaskContinuationOptions.ExecuteSynchronously);
现在正在加载变成这样。
data = await new BinaryData().Load(reader);
这里有什么我应该担心使用这种方法?例如异常处理等?
谢谢。我避免使用async/await的原因是为了防止为非常基本的任务生成状态机开销,但这是一个很好的解决方案,我想知道是否使用ContinueWith引入了问题。 –
@ M.kazemAkhgary,不,我没有看到它引入了任何问题,除了无法控制异常 – Nkosi