我正在实现我自己的,我对我正在做的自定义 XML 序列化程序MediaTypeFormatter
的方法有一些疑问:WriteToStreamAsync
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
我见过很多同步操作的例子,为了返回 a Task
,它们将代码包含在 a 中Task.Factory.StartNew()
,但是......可以吗?我的意思是,这不是让任务链接 IO 操作来提高可伸缩性吗?
我找到了两种可能的解决方案:
首先,我使用 aStreamWriter
并返回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
呢?
另一个,我使用内部内存流,并且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);
}
这将是最好的方法吗?