C# ASP.NET MVC中的异步方法

C# ASP.NET MVC中的异步方法,c#,asp.net,asp.net-mvc,multithreading,asynchronous,C#,Asp.net,Asp.net Mvc,Multithreading,Asynchronous,我想创建一个异步方法,它将打开一个线程并完成与当前http请求相对独立的几个任务(例如,发送电子邮件和生成文件,这两项都需要时间) 我创建了以下方法 private static async Task<T> DoSeparateTask<T>(Func<T> func) { return func(); } private静态异步任务DoSeparateTask(Func Func) { 返回func(); } 并希望以这样的方式使用它: priv

我想创建一个异步方法,它将打开一个线程并完成与当前http请求相对独立的几个任务(例如,发送电子邮件和生成文件,这两项都需要时间)

我创建了以下方法

private static async Task<T> DoSeparateTask<T>(Func<T> func)
{
    return func();
}
private静态异步任务DoSeparateTask(Func Func)
{
返回func();
}
并希望以这样的方式使用它:

private static void DoSomething()
{
    #step 1 - some code for immediate processing
    #step 2 - some code for generating documents which takes time
    var additionalDocumentGenerationWork = DoSeparateTask<Document>(() =>{
        #additional code for generating Document
       #even though it returns Document, but 99% time it wont be used in this method
    });
    #step 3 - some code for sending SMTP email which takes time
    var additionalDocumentGenerationWork = DoSeparateTask<bool>(() =>{
        #additional code for sending email
        return true;
    });

}
private static void DoSomething()
{
#步骤1-一些用于立即处理的代码
#步骤2-生成文档所需的一些代码
var additionalDocumentGenerationWork=DoSeparateTask(()=>{
#生成文档的附加代码
#即使它返回文档,但99%的时间它不会用于此方法
});
#步骤3-发送SMTP电子邮件所需时间的一些代码
var additionalDocumentGenerationWork=DoSeparateTask(()=>{
#发送电子邮件的附加代码
返回true;
});
}
一切都会编译,但是当我运行web应用程序时,它仍然会不断加载,并在呈现网页之前等待完成所有操作。由于另外两个任务(电子邮件和文档)与显示网页无关,如何使用异步修饰符来实现这一点

或者如果我对异步的理解是错误的。。。请帮我纠正


非常感谢。

您不需要
DoSeparateTask()
方法。相反,只需使用
Task.Run()

请注意,
additionalDocumentGenerationWork1
additionalDocumentGenerationWork2
(您在示例中使用了两次相同的名称,因此我在上面对其进行了更改以使代码合法)的类型分别为
Document
bool
。如果愿意,可以在第二个任务调用中使用
additionalDocumentGenerationWork1
(例如,传递第一个操作的结果)

或者如果我对异步的理解是错误的。。。请帮我纠正

正如我在博客上解释的那样。一天结束时,每个请求只有一个响应。换句话说,
async
让位于线程池,而不是客户端


您正在寻找一种在请求/响应生命周期之外执行操作的方法,ASP.NET不直接支持这种方法。我描述了几种方法。最好(最可靠)的方法是将工作放入队列中,并有一个独立的后端来处理队列(如Azure worker角色)。

您应该查看编译器给您的警告,因为该
异步
方法中没有任何
wait
语句。Stephen所写的是,这里还有一些解决这个问题的选项,非常感谢Stephen,它为我提供了明确的操作方向,因为每个文档和电子邮件都可以在1分钟内轻松处理,所以我按照您在博客中的建议修改了.NET framework 4.5.2 HostingEnvironment.QueueBackgroundWorkItem()。它的工作原理令人惊讶!
private static async Task DoSomething()
{
    // #step 1 - some code for immediate processing
    // #step 2 - some code for generating documents which takes time
    var additionalDocumentGenerationWork1 = await Task.Run(() =>
    {
        // #additional code for generating Document
        // #even though it returns Document, but 99% time it wont be used in this method
    });

    // #step 3 - some code for sending SMTP email which takes time
    var additionalDocumentGenerationWork2 = await Task.Run(() =>
    {
        // #additional code for sending email
        return true;
    });
}