c# – 如何处理可能是也可能不是异步的接口方法?

我正在尝试创建一个序列化接口(类似于 Cocoa的NSCoding协议),这样我就可以获得一个类的快速二进制表示,以通过网络或数据库中的存储发送.但是,某些情况(特别是涉及图像编码)有许多需要等待的异步方法.但是,如果字节没有按顺序写入,那么整个表示当然会被破坏.在继续下一个对象之前,我必须确保当前对象已完成序列化.这是我正在做的主要循环.
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,以便等待他们.问题是我有一个没有任何异步组件的序列化方法.我可以做两件事之一:

A)无论如何我都可以异步处理该类的序列化方法,并提出编译器警告说它将同步执行(我不喜欢编译器警告).

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

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

编辑我想到了一个选项C.我可以将整个方法包装在await Task.Run(…)调用中.这是正常的吗?

解决方法

我认为这里最好的解决方案,假设您想要同步执行该方法是正常写入,除非您将在方法结束时返回完成的任务.

要获得具有某些特定值的已完成任务,可以使用Task.FromResult().

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...