gpt4 book ai didi

.net - 在 Web API 中实现 MediaTypeFormatter.WriteToStreamAsync 的正确方法

转载 作者:行者123 更新时间:2023-12-04 04:50:18 25 4
gpt4 key购买 nike

我正在实现我自己的 MediaTypeFormatter我对方法有一些疑问 WriteToStreamAsync对于我正在做的自定义 XML 序列化程序:

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 呢? ?

另一个,我使用内部内存流,和 WriteAsyncwriteStream :
    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);
}

哪种方法是最好的方法?

最佳答案

当我知道某个操作将同步运行,但需要一个 Task 作为返回值时,我使用 TaskCompletionSource 实例创建一个已完成的 Task 并返回它。

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

doc.Save(writeStream);

var tcs = new TaskCompletionSource<object>();
tcs.SetResult(null);
return tcs.Task;
}

关于.net - 在 Web API 中实现 MediaTypeFormatter.WriteToStreamAsync 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17526299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com