【发布时间】:2013-07-08 22:12:57
【问题描述】:
我正在实现自己的 MediaTypeFormatter,我对我正在做的自定义 XML 序列化程序的 WriteToStreamAsync 方法有一些疑问:
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
我见过很多同步操作的例子,为了返回Task,他们将代码包含在Task.Factory.StartNew()中,但是……这样可以吗?我的意思是,这不是让任务链接 IO 操作来提高可扩展性吗?
我找到了两种可能的解决方案:
首先,我使用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呢?
另外,我用的是内部内存流,和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);
}
最好的方法是什么?
【问题讨论】:
标签: .net asynchronous asp.net-web-api task-parallel-library