我正在尝试创建一个序列化接口(类似于Cocoa的NSCoding
协议),以便我可以获得一个类的快速二进制表示,以通过网络或数据库中的存储发送。但是,某些情况(特别是涉及图像编码)有许多需要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
只需使用MemoryStream
和BitmapWriter
来编写BinaryWriter
可以直接接受的值,或ISerializable
个对象,然后吐出结果作为字节数组。 ISerializable
只是一个包含两种方法的接口(Serialize
和Deserialize
)。他们都返回Task
,以便await
可以async
。问题是当我有一个没有任何异步组件的序列化方法。我可以做两件事之一:
A)无论如何我都可以在return Task.Run(() => {});
上使用该类的序列化方法,并提出编译器警告说它将同步执行(我不喜欢编译器警告)。
B)在方法结束时手动返回一个空任务(task.Wait()
)。然而,这看起来和闻起来真的很奇怪。
A和B似乎都没有问题,但是我可能错过了这种方法有什么问题吗?我不知道Windows运行时中的二进制序列化程序(我包含标记只是为了消除任何混淆)。也许我可以考虑选项C?实际上我不想让序列化方法异步,但由于某种原因,CreateAsync
没有等待,我在尝试使用await Task.Run(...)
创建的对象之前得到了一个空引用异常准备好了。
编辑我想到了一个选项C.我可以将整个方法包装在{{1}}调用中。这是正常的吗?
答案 0 :(得分:4)
我认为这里最好的解决方案,假设您想要同步执行该方法是正常写入,除非您在方法结束时返回一个已完成的Task
。
要获得具有特定值的已完成Task
,您可以使用Task.FromResult()
。
如果您希望Task
没有价值(即实际只是Task
,而不是Task<TResult>
),您可以使用例如Task.FromResult(true)
({{1} }}并隐式将其强制转换为Task<bool>
。