首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从同步和异步函数c#运行异步函数

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

Stack Overflow用户
提问于 2015-03-23 12:35:22
回答 1查看 307关注 0票数 0

我在发“异步”电子邮件。

我使用一个通用的‘异步’函数来调用电子邮件功能,因为我不需要等待电子邮件的响应。

代码语言:javascript
复制
public Task SendAsync(....)
{
      ....
      return mailClient.SendMailAsync(email);
}

我需要从asyncsync函数调用它。

异步函数调用

代码语言:javascript
复制
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(...);'
}

从同步函数调用

代码语言:javascript
复制
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目的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-23 12:44:47

你可以:

( A)创建一个“失火忘了”的请求,就像你试图做的那样。

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

方法A将使用两个线程,第一个线程是请求线程,第二个线程是火线程和遗忘线程。这将从请求线程池中窃取一个线程,导致在重载下线程饥饿。

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

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

当使用异步/等待时,线程只有在执行CPU工作时才是活动的,并且在执行IO绑定的工作时,线程被释放以服务其他请求/任务。

当启动一个新线程时,将阻塞该线程,直到它完成为止(除非您想要做一些复杂的线程同步)。

TL;DR:异步/等待的效率要高得多,如果您选择使用Fire并忘记,您最终将饥饿您的way服务器。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29210346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档