bor*_*den 7 c# asynchronous async-await c#-5.0 windows-runtime
我正在尝试创建一个序列化接口(类似于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;
}
}
Run Code Online (Sandbox Code Playgroud)
Archiver只需使用MemoryStream并BitmapWriter在引擎盖下编写BinaryWriter可以直接接受的值或ISerializable对象,然后将结果作为字节数组吐出. ISerializable只是一个有两种方法(Serialize和Deserialize)的接口.他们都返回,Task以便他们可以await编辑.问题是当我有一个没有任何异步组件的序列化方法.我可以做两件事之一:
A)async无论如何我都可以使用该类的序列化方法,并提出编译器警告说它将同步执行(我不喜欢编译器警告).
B)在方法(return Task.Run(() => {});)的末尾手动返回一个空任务.然而,这看起来和气味真的很奇怪.
A和B似乎都没有问题,但是我可能错过了这种方法有什么问题吗?我不知道Windows运行时中的二进制序列化程序(我包含标记只是为了消除任何混淆).也许我可以考虑选项C?实际上我不想让序列化方法异步,但由于某种原因task.Wait()没有等待,并且我在尝试使用CreateAsync在它准备好之前创建的对象时获得了一个空引用异常.
编辑我想到了一个选项C.我可以将整个方法包装在一个await Task.Run(...)调用中.这是正常的吗?
我认为这里最好的解决方案是,假设您想同步执行该方法,那就正常编写它,除非您将Task在方法末尾返回一个已完成的值。
要获得具有某些特定值的完成Task,您可以使用Task.FromResult().
如果您想要Task没有值的 a (即实际上只是Task,而不是Task<TResult>),您可以使用 example Task.FromResult(true)(这是 a Task<bool>)并将其隐式转换为Task。