2

私は自分自身を実装していましたが、私が行っているカスタム XML シリアライザーMediaTypeFormatterのメソッドについていくつか質問があります。WriteToStreamAsync

public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)

同期的に動作する例をたくさん見てきましたが、 a を返すためにTaskコードを a で囲んでいるのTask.Factory.StartNew()ですが・・・それでよろしいでしょうか?つまり、スケーラビリティを向上させるためにタスクに IO 操作をリンクさせるという点に勝るものはありませんか?

私は2つの可能な解決策を見つけました:

まず、 a を使用しStreamWriterてタスクを返しFlushAsyncます。

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        XDocument doc = new XDocument();
        doc.Add(SerializeType(type, value));

        var sw = new StreamWriter(writeStream,Encoding.UTF8,4096);
        sw.AutoFlush = false;
        doc.Save(sw);
        return sw.FlushAsync();
    }

ここでの私の質問は、StreamWriterその後どうなりますか? フレームワークは を破棄すると思いますwriteStreamが、 はStreamWriterどうですか?

もう 1 つは、内部メモリ ストリームを使用し、次のWriteAsyncようにしwriteStreamます。

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        XDocument doc = new XDocument();
        doc.Add(SerializeType(type, value));

        Byte[] buffer = null;
        using (var ms = new MemoryStream(4096))
        {
            doc.Save(ms);
            buffer = ms.ToArray();
        }

        return writeStream.WriteAsync(buffer, 0, buffer.Length);
    }

それを行う最良の方法はどれですか?

4

2 に答える 2

0

StartNewI/Oバウンドではなく、コンピューティングバウンドの作業用です。明らかに、そのスレッドも待機する必要があるため、スレッドを与えることは意味がありません。MSDNによると

StartNew メソッドは、長時間実行されるコンピューティング バウンド タスクをきめ細かく制御する必要がある場合にのみ使用してください。

このようなものを使用できますusing

public override async Task WriteToStreamAsync(Type type, object value, 
                                              Stream stream, 
                                              HttpContent content, 
                                              TransportContext transportContext)
{                                     
    if (string.IsNullOrEmpty(JsonpCallbackFunction))
    {
        await base.WriteToStreamAsync(type, value, stream, content,
                                                            transportContext);
        return;
    }

    using (var writer = new StreamWriter(stream))
    {
        writer.Write(JsonpCallbackFunction + "(");
        writer.Flush();

        await base.WriteToStreamAsync(type, value, stream, content,
                                                            transportContext);

        writer.Write(")");
        writer.Flush();
    }
}

ブラッド・ウィルソンの言葉を引用します。

于 2013-07-08T13:04:03.620 に答える