Questions tagged «async-await»

这涵盖了使用async和await关键字的各种编程语言支持的异步编程模型。

7
浏览器取消请求时,ASP.NET Web API OperationCanceledException
当用户加载页面时,它发出一个或多个ajax请求,这些请求命中ASP.NET Web API 2控制器。如果用户导航到另一个页面,则在这些ajax请求完成之前,浏览器将取消这些请求。然后,我们的ELMAH HttpModule为每个取消的请求记录两个错误: 错误1: System.Threading.Tasks.TaskCanceledException: A task was canceled. at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- End of stack …

2
等待和ContinueWith之间的区别
在下面的示例中,有人可以解释是否await和ContinueWith是同义词。我正在尝试第一次使用TPL,并且已经阅读了所有文档,但不了解其中的区别。 等待: String webText = await getWebPage(uri); await parseData(webText); ContinueWith: Task<String> webText = new Task<String>(() => getWebPage(uri)); Task continue = webText.ContinueWith((task) => parseData(task.Result)); webText.Start(); continue.Wait(); 在特定情况下,一个相对于其他优先吗?

4
我应该避免使用“异步无效”事件处理程序吗?
我知道使用即弃即用async void方法启动任务通常被认为是一个坏主意,因为没有跟踪待处理任务的信息,并且处理此类方法中可能引发的异常非常棘手。 我是否也应该一般避免使用async void事件处理程序?例如, private async void Form_Load(object sender, System.EventArgs e) { await Task.Delay(2000); // do async work // ... } 我可以这样重写它: Task onFormLoadTask = null; // track the task, can implement cancellation private void Form_Load(object sender, System.EventArgs e) { this.onFormLoadTask = OnFormLoadTaskAsync(sender, e); } private async Task OnFormLoadTaskAsync(object sender, …

6
暂停功能在Kotlin Coroutine中意味着什么
我正在阅读Kotlin Coroutine,并且知道它基于suspend功能。但是什么suspend意思呢? 协程或功能被暂停? 来自https://kotlinlang.org/docs/reference/coroutines.html 基本上,协程是可以在不阻塞线程的情况下挂起的计算 听说人们经常说“暂停功能”。但我认为是协程被暂停,因为它正在等待功能完成?“挂起”通常表示“停止操​​作”,在这种情况下,协程空闲。 🤔我们应该说协程暂停了吗? 哪个协程被暂停? 来自https://kotlinlang.org/docs/reference/coroutines.html 为了继续类推,await()可以是一个暂停函数(因此也可以从async {}块内调用),该例程可以暂停协程直到完成一些计算并返回其结果: async { // Here I call it the outer async coroutine ... // Here I call computation the inner coroutine val result = computation.await() ... } says它说“挂起协程直到完成计算”,但是协程就像轻量级线程。因此,如果协程被挂起,如何进行计算? 我们看到await被调用了computation,所以可能是asyncreturn Deferred,这意味着它可以启动另一个协程 fun computation(): Deferred<Boolean> { return async { true } } …

2
等待与task.Result相同的已完成任务?
我目前正在阅读Stephen Cleary撰写的“ C#Cookbook中的并发性 ”,并且注意到以下技术: var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask; downloadTask是对的调用httpclient.GetStringAsync,timeoutTask正在执行Task.Delay。 如果它没有超时,则downloadTask已经完成。downloadTask.Result考虑到任务已经完成,为什么需要第二次等待而不是返回?

7
使用异步/等待尝试/捕获块
我正在研究节点7异步/等待功能,并不断跨这样的代码绊脚 function getQuote() { let quote = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in …

2
使接口实现异步
我目前正在尝试使用一些异步方法来制作我的应用程序。我所有的IO都是通过接口的显式实现来完成的,我对如何使操作异步感到有些困惑。 如我所见,我在实现中有两个选择: interface IIO { void DoOperation(); } 选项1: 执行一个隐式实现异步并等待隐式实现中的结果。 class IOImplementation : IIO { async void DoOperation() { await Task.Factory.StartNew(() => { //WRITING A FILE OR SOME SUCH THINGAMAGIG }); } #region IIO Members void IIO.DoOperation() { DoOperation(); } #endregion } 选项2: 执行显式实现异步并等待隐式实现中的任务。 class IOAsyncImplementation : IIO { private …

13
如何限制并发异步I / O操作的数量?
// let's say there is a list of 1000+ URLs string[] urls = { "http://google.com", "http://yahoo.com", ... }; // now let's send HTTP requests to each of these URLs in parallel urls.AsParallel().ForAll(async (url) => { var client = new HttpClient(); var html = await client.GetStringAsync(url); }); 这是问题所在,它会同时启动1000多个Web请求。有没有简单的方法来限制这些异步http请求的并发数量?这样,在任何给定时间下载的网页都不会超过20个。如何以最有效的方式做到这一点?

3
获取TransactionScope以使用异步/等待
我试图整合async/ await到我们的服务总线。我SingleThreadSynchronizationContext基于此示例http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx实现了一个。 它工作正常,除了一两件事:TransactionScope。我等待里面的东西TransactionScope,它打破了TransactionScope。 TransactionScope似乎不能与async/ 配合使用await,当然是因为它使用将内容存储在线程中ThreadStaticAttribute。我得到这个例外: “ TransactionScope嵌套不正确。”。 我试图TransactionScope在排队任务之前保存数据,并在运行它之前将其还原,但似乎并没有改变任何事情。和TransactionScope代码是一个烂摊子,所以真的很难理解发生了什么事情在那里。 有办法使它起作用吗?有TransactionScope什么替代方法吗?

4
通过ASP.NET Web API有效地使用异步/等待
我正在尝试async/await在我的Web API项目中使用ASP.NET 的功能。我不太确定这是否会对我的Web API服务的性能产生任何影响。请从我的应用程序下面找到工作流程和示例代码。 工作流程: UI应用程序→Web API端点(控制器)→Web API服务层中的调用方法→调用另一个外部Web服务。(这里有数据库交互等) 控制器: public async Task<IHttpActionResult> GetCountries() { var allCountrys = await CountryDataService.ReturnAllCountries(); if (allCountrys.Success) { return Ok(allCountrys.Domain); } return InternalServerError(); } 服务层: public Task<BackOfficeResponse<List<Country>>> ReturnAllCountries() { var response = _service.Process<List<Country>>(BackOfficeEndpoint.CountryEndpoint, "returnCountries"); return Task.FromResult(response); } 我测试了上面的代码并且正在工作。但我不确定这是否是的正确用法async/await。请分享您的想法。

4
异步/等待隐式返回诺言?
我读到用async关键字标记的异步函数隐式返回一个promise: async function getVal(){ return await doSomethingAync(); } var ret = getVal(); console.log(ret); 但这并不连贯...假设doSomethingAsync()返回一个诺言,而await关键字将从诺言中返回值,而不是诺言itef,那么我的getVal函数应该返回该值,而不是隐式诺言。 那到底是什么情况?用async关键字标记的函数是隐式返回promise还是控制它们返回的内容? 也许,如果我们不明确地返回某些东西,那么他们会隐式地返回一个诺言...? 更清楚地说,上述内容与 function doSomethingAync(charlie) { return new Promise(function (resolve) { setTimeout(function () { resolve(charlie || 'yikes'); }, 100); }) } async function getVal(){ var val = await doSomethingAync(); // val is not a promise console.log(val); …

2
为什么要创建异步WebAPI操作而不是同步操作?
我在创建的Web API中执行以下操作: // GET api/<controller> [HttpGet] [Route("pharmacies/{pharmacyId}/page/{page}/{filter?}")] public CartTotalsDTO GetProductsWithHistory(Guid pharmacyId, int page, string filter = null ,[FromUri] bool refresh = false) { return delegateHelper.GetProductsWithHistory(CustomerContext.Current.GetContactById(pharmacyId), refresh); } 通过以下方式通过Jquery Ajax调用完成对此Web服务的调用: $.ajax({ url: "/api/products/pharmacies/<%# Farmacia.PrimaryKeyId.Value.ToString() %>/page/" + vm.currentPage() + "/" + filter, type: "GET", dataType: "json", success: function (result) { vm.items([]); var …

9
是否可以“等待收益回报DoSomethingAsync()”
常规迭代器块(即“收益回报”)是否与“异步”和“等待”不兼容? 这样可以很好地说明我要做什么: async Task<IEnumerable<Foo>> Method(String [] Strs) { // I want to compose the single result to the final result, so I use the SelectMany var finalResult = UrlStrings.SelectMany(link => //i have an Urlstring Collection await UrlString.DownLoadHtmlAsync() //download single result; DownLoadHtmlAsync method will Download the url's html code ); return …

4
为什么默认情况下所有功能都不应该异步?
.net 4.5 的异步等待模式正在改变范式。真是太好了。 我一直在将一些IO繁重的代码移植到async-await中,因为阻塞已成为过去。 不少人将异步等待与僵尸侵扰进行了比较,我发现它相当准确。异步代码与其他异步代码一样(您需要一个异步函数才能等待一个异步函数)。因此,越来越多的功能变得异步,并且这在您的代码库中不断增长。 将功能更改为异步在某种程度上是重复的并且是没有想象力的工作。async在声明中添加一个关键字,将返回值包装为Task<>,您已经完成了很多工作。整个过程有多么容易,这让人很不安,很快,一个替换文本的脚本将为我自动完成大多数“移植”。 现在是问题了。如果我的所有代码都在缓慢地变为异步状态,为什么不将其全部默认情况下设为异步呢? 我认为明显的原因是性能。异步等待有它的开销,不需要异步的代码,最好不要。但是,如果性能是唯一的问题,那么肯定可以进行一些巧妙的优化,从而在不需要时自动消除开销。我已经阅读了有关“快速路径”优化的信息,在我看来,仅它一项就可以解决大部分问题。 也许这可以与垃圾收集器带来的范式转变相提并论。在早期的GC时代,释放自己的内存肯定更有效。但是,大众仍然选择自动收集,而选择效率更高,更简单的代码,这些代码可能效率较低(甚至可以说不再适用)。也许这里应该是这样吗?为什么所有功能都不应该异步?

3
.net 4.5中使用HttpClient努力使Cookie脱颖而出
我有以下代码可以成功运行。我不知道如何从响应中获取cookie。我的目标是我希望能够在请求中设置cookie并从响应中获取cookie。有什么想法吗? private async Task<string> Login(string username, string password) { try { string url = "http://app.agelessemail.com/account/login/"; Uri address = new Uri(url); var postData = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("username", username), new KeyValuePair<string, string>("password ", password) }; HttpContent content = new FormUrlEncodedContent(postData); var cookieJar = new CookieContainer(); var handler = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.