微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

原文地址:https://www.jb51.cc/csharp/100371.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐