gpt4 book ai didi

c# - 等待流的人口

转载 作者:太空狗 更新时间:2023-10-29 21:34:03 25 4
gpt4 key购买 nike

在我的 MVC Controller 中,我有一个操作将填充我稍后将使用的流:

[HttpPost]
public async Task<HttpResponseMessage> BuildFileContent(FileParameters fileParams)
{
byte[] output;
if (fileParams != null)
{
using (var stream = new MemoryStream())
{
await Task.Run(() => PopulateFile(fileParams, stream)); // Here i populate the stream
stream.Flush();
output = stream.ToArray();
}
var guid = Guid.NewGuid().ToString();
FileContents.Add(guid, output); // just save the content for later use
return this.Request.CreateResponse(HttpStatusCode.OK, new { Value = guid });
}

return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid parameters");
}

我遇到这个问题是因为 ReSharper 发出警告:access on disposed closurePopulateFile(fileParams, stream) 并指出 stream.

我已经搜索了它的含义,它似乎警告我可以使用一个已经处理过的流。

我想等待流的填充,因为任务可能需要很长时间。

有没有一种方法可以让我在 ReSharper 不发出此警告的情况下等待流的填充?此外,我在 using 子句中调用 stream ,在我调用 flush 或 using 子句的最后一行被执行之前,流不应该被释放,对吧?那么,为什么 ReSharper 会警告访问已处置的流?

最佳答案

Resharper 警告您,因为您在 lambda 表达式中使用流,该表达式基本上可以随时运行,而不仅仅是在 using 范围内。
如果这是您的代码,您可以在任务结束之前处理该流,并且您将得到一个 ObjectDisposedException:

Task task = null;
using (var stream = new MemoryStream())
{
task = Task.Run(() => PopulateFile(fileParams, stream)); // Here i populate the stream
stream.Flush();
output = stream.ToArray();
}
await task;

然而,在您的情况下,您等待该操作并仅在该操作完成后处理该流。所以基本上你是清楚的,但 Resharper 显然不知道这一点。

要完全清除警告,您可以将 using 范围放在任务中:

await Task.Run(() => 
{
using (var stream = new MemoryStream())
{
PopulateFile(fileParams, stream);
stream.Flush();
output = stream.ToArray();
}
});

我建议你这样做。

关于c# - 等待流的人口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20822280/

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