私は自分自身を実装していましたが、私が行っているカスタム 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);
}
それを行う最良の方法はどれですか?