Questions tagged «async-await»

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


5
如何在.NET中产生并等待实现控制流?
据我了解yield,如果从迭代器块内部使用该关键字,它将控制流返回到调用代码,并且当再次调用该迭代器时,它将在中断的地方继续执行。 同样,await不仅等待被调用方,而且将控制权返回给调用方,仅在调用方awaits方法时从中断的地方接管。 换句话说,没有线程,异步和等待的“并发性”是由聪明的控制流引起的错觉,其细节被语法隐藏了。 现在,我是一名前汇编程序员,并且对指令指针,堆栈等非常熟悉,并且了解了正常的控制流程(子例程,递归,循环,分支)的工作方式。但是这些新结构-我不明白。 当await到达,如何运行时知道什么是一段代码下一步应该执行?它如何知道何时可以从上次中断的地方恢复,以及如何记住在哪里?当前调用堆栈发生了什么,是否以某种方式保存了它?如果调用方法在此之前进行其他方法调用await怎么办?为什么堆栈不被覆盖?在异常和堆栈展开的情况下,运行时到底将如何处理所有这一切? 当yield到达,如何运行跟踪那里的东西应该拿起点的?迭代器状态如何保存?

6
“退货等待承诺”与“退货承诺”之间的区别
给定下面的代码示例,行为上是否有任何差异,如果有,这些差异是什么? return await promise async function delay1Second() { return (await delay(1000)); } return promise async function delay1Second() { return delay(1000); } 据我了解,第一个将在异步函数内进行错误处理,并且错误会冒出异步函数的Promise。但是,第二个需要较少的滴答声。这样对吗? 此片段只是返回Promise供参考的常用功能。 function delay(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); }

2
如何在异步/等待中使用RestSharp
我正在努力寻找一些使用RestSharp和async和的异步C#代码的现代示例await。我知道Haack最近有更新,但是我不知道如何使用新方法。 此外,我如何提供取消令牌,以便可以取消操作(例如,如果某人厌倦了等待,并按了应用程序UI中的“取消”按钮)。

3
在新的Promise()构造函数中使用async / await是一种反模式吗?
我正在使用该async.eachLimit函数来一次控制最大操作数。 const { eachLimit } = require("async"); function myFunction() { return new Promise(async (resolve, reject) => { eachLimit((await getAsyncArray), 500, (item, callback) => { // do other things that use native promises. }, (error) => { if (error) return reject(error); // resolve here passing the next value. }); }); } …

5
为什么此异步操作挂起?
我有一个多层.Net 4.5应用程序,该应用程序使用C#的new async和await挂起的关键字来调用方法,但我不知道为什么。 在底部,我有一个异步方法来扩展我们的数据库实用程序OurDBConn(基本上是基础DBConnection和DBCommand对象的包装器): public static async Task<T> ExecuteAsync<T>(this OurDBConn dataSource, Func<OurDBConn, T> function) { string connectionString = dataSource.ConnectionString; // Start the SQL and pass back to the caller until finished T result = await Task.Run( () => { // Copy the SQL connection so that we don't get two …

2
与ASP.NET Core相关的ConfigureAwait(false)?
我在GitHub上偶然发现了一个问题(https://github.com/HTBox/allReady/issues/1313),他们ConfigureAwait(false)在ASP.NET Core中讨论了删除代码的问题,并声称 的呼叫ConfigureAwait(false)是多余的,无济于事 我在这里能找到的最好的答案是“旁注”(来自Stephen Cleary,https: //stackoverflow.com/a/40220190/2805831 ),它告诉我们 ASP.NET Core不再具有“上下文” 因此,ConfigureAwait(false)在ASP.NET Core中(即使使用完整的.Net Framework)真的没有必要吗?在某些情况下,它在性能上是否有任何真正的收获?结果/语义上是否有所不同? 编辑:如果我将其托管为控制台应用程序或IIS,在这方面是否有所不同?


4
如何“等待”回调返回?
在使用简单的回调(例如以下示例)时: test() { api.on( 'someEvent', function( response ) { return response; }); } 如何更改功能以使用异步/等待?具体来说,假设“ someEvent”被保证只能被调用一次,我希望函数测试是一个异步函数,该异步函数在执行回调之前不会返回,例如: async test() { return await api.on( 'someEvent' ); }

3
实体框架可查询异步
我正在使用Entity Framework 6处理一些Web API,而我的控制器方法之一是“获取全部”,期望从数据库中以形式接收表的内容IQueryable<Entity>。在我的存储库中,我想知道是否有任何有利的原因来异步执行此操作,因为我是初次使用带有异步功能的EF。 基本上可以归结为 public async Task<IQueryable<URL>> GetAllUrlsAsync() { var urls = await context.Urls.ToListAsync(); return urls.AsQueryable(); } 与 public IQueryable<URL> GetAllUrls() { return context.Urls.AsQueryable(); } 异步版本实际上会在这里带来性能上的好处吗?还是我先投影到一个列表(使用异步方法,然后转到IQueryable)会导致不必要的开销?

3
HttpClient中带有await的异步调用永远不会返回
我正在C#Win8 CP上的一个基于xaml的Metro应用程序中打个电话。此调用仅命中Web服务并返回JSON数据。 HttpMessageHandler handler = new HttpClientHandler(); HttpClient httpClient = new HttpClient(handler); httpClient.BaseAddress = new Uri("http://192.168.1.101/api/"); var result = await httpClient.GetStreamAsync("weeklyplan"); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeeklyPlanData[])); return (WeeklyPlanData[])ser.ReadObject(result); 它挂在,await但http调用实际上几乎立即返回(通过提琴手确认);好像await被忽略了,就挂在那里。 询问之前 -是-专用网络功能已打开。 任何想法为什么会挂起?

5
JavaScript promise和async await有什么区别?
我已经在移动应用程序和Web应用程序中使用了ECMAScript 6和ECMAScript 7功能(由于Babel)。 第一步显然是达到ECMAScript 6级别。我学习了许多异步模式,promise(确实很有希望),生成器(不确定为什么使用*符号)等。其中,promise非常适合我的目的。我已经在我的应用程序中使用它们很多次了。 这是我如何实现基本诺言的示例/伪代码- var myPromise = new Promise( function (resolve,reject) { var x = MyDataStore(myObj); resolve(x); }); myPromise.then( function (x) { init(x); }); 随着时间的流逝,我遇到了ECMAScript 7功能,其中之一是ASYNC和AWAIT关键字/功能。这些结合在一起创造了很大的奇迹。我已经开始用代替我的一些诺言async & await。它们似乎为编程风格增加了巨大的价值。 同样,这是我的async,await函数的伪代码,如下所示: async function myAsyncFunction (myObj) { var x = new MyDataStore(myObj); return await x.init(); } var returnVal = await myAsyncFunction(obj); …

1
使用SqlCommand Async方法处理大数据的性能糟糕
使用异步调用时,我遇到了主要的SQL性能问题。我创建了一个小案例来演示该问题。 我在驻留在我们LAN中的SQL Server 2016上创建了一个数据库(因此没有localDB)。 在该数据库中,我有一个WorkingCopy包含2列的表: Id (nvarchar(255, PK)) Value (nvarchar(max)) DDL CREATE TABLE [dbo].[Workingcopy] ( [Id] [nvarchar](255) NOT NULL, [Value] [nvarchar](max) NULL, CONSTRAINT [PK_Workingcopy] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] …

2
将同步代码包装为异步调用
我在ASP.NET应用程序中有一个方法,要花大量时间才能完成。在一个用户请求期间,此方法的调用最多可能发生3次,具体取决于用户提供的缓存状态和参数。每次通话大约需要1-2秒才能完成。该方法本身是对服务的同步调用,无法覆盖实现。 因此,对该服务的同步调用如下所示: public OutputModel Calculate(InputModel input) { // do some stuff return Service.LongRunningCall(input); } 方法的用法是(请注意,方法的调用可能会发生多次): private void MakeRequest() { // a lot of other stuff: preparing requests, sending/processing other requests, etc. var myOutput = Calculate(myInput); // stuff again } 我尝试从自己的角度更改实现,以提供此方法的同步工作,这就是到目前为止的内容。 public async Task<OutputModel> CalculateAsync(InputModel input) { return await Task.Run(() => …

5
我是否应该担心“此异步方法缺少'await'运算符,并且将同步运行”警告
我有一个暴露一些异步方法的接口。更具体地说,它具有定义的返回Task或Task <T>的方法。我正在使用async / await关键字。 我正在实现此接口。但是,在其中某些方法中,此实现没有任何等待。因此,我收到编译器警告“此异步方法缺少'await'运算符,将同步运行...” 我知道为什么会收到错误,但想知道在这种情况下是否应该对它们采取任何措施。忽略编译器警告是错误的。 我知道我可以通过等待Task.Run来修复它,但是对于仅执行一些廉价操作的方法来说,这是错误的。听起来也好像会给执行增加不必要的开销,但是由于不确定async关键字,因此我也不确定是否已经存在。 我应该只是忽略警告,还是有办法解决我所没有看到的问题?

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.