C# Http.IMIDleware在未传递TaskScheduler的情况下不会创建任务
(.Net 3.1,Visual Studio 2019) 在DevExpress代码示例中,以下http中间件代码收到以下警告: 在未传递TaskScheduler的情况下不要创建任务 重写代码以启动新任务的正确方法是什么C# Http.IMIDleware在未传递TaskScheduler的情况下不会创建任务,c#,asp.net,asp.net-core,devexpress,task-parallel-library,C#,Asp.net,Asp.net Core,Devexpress,Task Parallel Library,(.Net 3.1,Visual Studio 2019) 在DevExpress代码示例中,以下http中间件代码收到以下警告: 在未传递TaskScheduler的情况下不要创建任务 重写代码以启动新任务的正确方法是什么 public class ExportMiddleware : IMiddleware { ...... public Task InvokeAsync(HttpContext context, RequestDelegate next) {
public class ExportMiddleware : IMiddleware
{
......
public Task InvokeAsync(HttpContext context, RequestDelegate next)
{
......
_ = await new TaskFactory().StartNew(() => // warning: Do not create tasks without passing a TaskScheduler
{
report.CreateDocument();
using (MemoryStream fs = new MemoryStream())
{
if (format == pdf)
report.ExportToPdf(fs);
else if (format == xlsx)
report.ExportToXlsx(fs);
else if (format == docx)
report.ExportToDocx(fs);
context.Response.Clear();
context.Response.Headers.Append("Content-Type", "application/" + format);
context.Response.Headers.Append("Content-Transfer-Encoding", "binary");
context.Response.Headers.Append("Content-Disposition", "attachment; filename=ExportedDocument." + format);
context.Response.Body.WriteAsync(fs.ToArray(), 0, fs.ToArray().Length);
return context.Response.CompleteAsync();
}
});
从技术上讲,要回答实际问题,代码应该使用
Task.Run
而不是StartNew
:
_ = Task.Run(() =>
然而,这是一个非常糟糕的想法。不仅如此,它还将在将来的某个随机时间使用context.Response
。它将开始写入响应流,然后在写入完成之前完成流。它完全坏了
我认为更合适的解决方案是完全移除工厂/启动/运行,并在必要时使用wait
:
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
......
report.CreateDocument();
using (MemoryStream fs = new MemoryStream())
{
if (format == pdf)
report.ExportToPdf(fs);
else if (format == xlsx)
report.ExportToXlsx(fs);
else if (format == docx)
report.ExportToDocx(fs);
context.Response.Clear();
context.Response.Headers.Append("Content-Type", "application/" + format);
context.Response.Headers.Append("Content-Transfer-Encoding", "binary");
context.Response.Headers.Append("Content-Disposition", "attachment; filename=ExportedDocument." + format);
await context.Response.Body.WriteAsync(fs.ToArray(), 0, fs.ToArray().Length);
await context.Response.CompleteAsync();
}
}
你为什么要用一个任务来完成这项工作?你认为创建自己的任务工厂能给你带来什么?