gpt4 book ai didi

c# - 我如何处理可能异步也可能不异步的接口(interface)方法?

转载 作者:太空狗 更新时间:2023-10-29 20:31:03 25 4
gpt4 key购买 nike

我正在尝试创建一个序列化接口(interface)(类似于 Cocoa 的 NSCoding 协议(protocol)),以便我可以获得一个类的快速二进制表示,以便通过网络发送或存储在数据库中。但是,某些情况(特别是涉及图像编码)有许多需要 await 的异步方法。荷兰国际集团但是,如果字节没有按顺序写入,那么整个表示当然会损坏。在继续处理下一个对象之前,我必须确保当前对象已完成序列化。这是我正在做的事情的主循环。

 public async static Task<byte[]> Serialize(this IList<ISerializable> list) {
using (Archiver archiver = new Archiver()) {
archiver.Write(list.Count);
foreach (ISerializable value in list) {
await archiver.Write(value);
}
return archiver.Result;
}
}

Archiver只使用 MemoryStreamBitmapWriter在引擎盖下写入 BinaryWriter 的任一值可以直接接受,或者ISerializable对象,然后将结果作为字节数组吐出。 ISerializable只是一个具有两种方法( SerializeDeserialize )的接口(interface)。他们都返回 Task这样他们就可以是await编辑。问题是当我有一个没有任何异步组件的序列化方法时。我可以做以下两件事之一:

A) 我可以继续async无论如何,该类的序列化方法并忍受编译器警告说它将同步执行(我不喜欢编译器警告)。

B) 在方法结束时手动返回一个空任务 (return Task.Run(() => {});)。然而,这看起来和闻起来都很奇怪。

A 和 B 似乎都可以毫无问题地执行,但是这种方法是否有任何我可能遗漏的问题?我不知道 Windows 运行时中有二进制序列化程序(我包含该标记只是为了消除任何混淆)。也许我可以考虑选项C?实际上我不想让序列化方法异步,但出于某种原因 task.Wait()没有等待,我在尝试使用由 CreateAsync 创建的对象时收到空引用异常在它准备好之前。

编辑 我想到了选项 C。我可以将整个方法包装在 await Task.Run(...) 中。称呼。这正常吗?

最佳答案

我认为这里最好的解决方案,假设你想同步执行该方法是正常编写它,除非你将返回一个完成的 Task在方法的最后。

获得完整的Task有一些特定的值,你可以使用 Task.FromResult() .

如果你想要一个Task没有值(value)(即实际上只是 Task ,而不是 Task<TResult> ),你可以使用例如 Task.FromResult(true) (这是一个 Task<bool> )并将其隐式转换为 Task .

关于c# - 我如何处理可能异步也可能不异步的接口(interface)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16032932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com