从同步和异步函数c#运行异步函数

时间:2015-03-23 12:35:23

标签: c# asynchronous

我正在发送'Async'电子邮件。

我使用常见的“异步”功能来调用电子邮件功能,因为我不需要等待电子邮件的响应。

public Task SendAsync(....)
{
      ....
      return mailClient.SendMailAsync(email);
}

我需要从asyncsync函数调用它。

从异步功能调用

public async Task<ActionResult> AsyncFunction(...)
{
   ....
   EmailClass.SendAsync(...);
   ....
   // gives runtime error.
   // "An asynchronous module or handler completed while an asynchronous operation was still pending..."
   // Solved by using 'await EmailClass.SendAsync(...);'
}

从同步功能调用

public ActionResult syncFunction(...)
{
   ....
   EmailClass.SendAsync(...);
   ....
   // gives runtime error. 
   // "An asynchronous operation cannot be started at this time..."
   // Solved by converting the function as above function
}

这两个函数都会给出运行时错误,然后在异步函数中使用await关键字来解决。

但是通过使用await,它违背了我running it on background without waiting for response的目的。

如何在不等待响应的情况下调用异步函数?

1 个答案:

答案 0 :(得分:1)

你可以:

A)创建一个“火与忘记”&#39;请求,正如您尝试的那样。

B)等待您的请求结果异步。

方法A将使用2个线程,第一个是你的请求线程,第二个是fire和forget线程。这会从请求线程池中窃取一个线程,导致在负载很重的情况下线程饥饿。

当有要处理的事情时,方法B将花费1个线程。请求线程是。

方法B将消耗更少的资源,而方法A可能会快几毫秒,但代价是一个线程(阅读:昂贵!)。

使用Async / await时,线程仅在执行CPU工作时处于活动状态,并在执行IO绑定工作时释放以供其他请求/任务使用。

在启动新线程时,将阻塞该线程直到完成(除非你想做一些复杂的线程同步)。

TL; DR :Async / Await效率更高,如果您选择使用Fire和Forget,最终会使您的网络服务器挨饿。

如果您仍想运行后台任务,read this blog post: Search Results How to run Background Tasks in ASP.NET - Scott Hanselman