Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Http.IMIDleware在未传递TaskScheduler的情况下不会创建任务_C#_Asp.net_Asp.net Core_Devexpress_Task Parallel Library - Fatal编程技术网

C# Http.IMIDleware在未传递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) {

(.Net 3.1,Visual Studio 2019)

在DevExpress代码示例中,以下http中间件代码收到以下警告:

在未传递TaskScheduler的情况下不要创建任务

重写代码以启动新任务的正确方法是什么

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();
  }
}

你为什么要用一个任务来完成这项工作?你认为创建自己的任务工厂能给你带来什么?