7

NSCodingクラスのバイナリ表現をすばやく取得して、ネットワーク経由で送信したり、データベースに保存したりできるように、シリアライゼーション インターフェイス (Cocoa のプロトコルに似ています) を作成しようとしています。awaitただし、一部のケース (特にイメージ エンコーディングを含む) には、 ingを必要とする多くの非同期専用メソッドがあります。ただし、バイトが順番に書き込まれない場合、もちろん表現全体が破損します。次のオブジェクトに進む前に、現在のオブジェクトのシリアル化が完了していることを確認する必要があります。これが私がやっていることのメインループです。

 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;
        }
    }

ArchiverMemoryStream内部で andを使用して、直接受け入れることができるBitmapWriter値またはオブジェクトのいずれかを書き込み、結果をバイト配列として吐き出します。 は、2 つのメソッド (および)を持つ単なるインターフェイスです。彼らは両方とも戻ってきて、教育を受けることができます。問題は、非同期コンポーネントを持たないシリアル化メソッドがある場合です。次の 2 つのいずれかを行うことができます。BinaryWriterISerializableISerializableSerializeDeserializeTaskawait

A)asyncとにかく、そのクラスのシリアライゼーション メソッドを追加して、同期的に実行されるというコンパイラの警告に我慢できます (コンパイラの警告が表示されるのは好きではありません)。

B) メソッドの最後で手動で空のタスクを返します ( return Task.Run(() => {});)。しかし、これは見た目も匂いも本当に変です。

A と B の両方が問題なく実行されているように見えますが、このアプローチで見逃した問題はありますか? Windows ランタイムのバイナリ シリアライザーについては知りません (混乱を避けるためにタグを含めました)。おそらく、私が検討できるオプションCはありますか?実際には、シリアル化メソッドを非同期にしたくありませんでしたが、何らかの理由で待機していませんでした。準備が整う前にtask.Wait()作成されたオブジェクトを使用しようとすると、null 参照例外が発生していました。CreateAsync

EDITオプションCを考えました。メソッド全体をawait Task.Run(...)呼び出しでラップするだけです。これは正常でしょうか?

4

1 に答える 1