Questions tagged «async-await»

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

2
实体框架异步操作需要十倍的时间才能完成
我有一个使用Entity Framework 6处理数据库的MVC站点,并且我一直在尝试对其进行更改,以使所有内容都作为异步控制器运行,并且对数据库的调用作为它们的异步对应对象(例如ToListAsync()而不是ToList()) 我遇到的问题是,仅将查询更改为异步已使它们的运行速度变得异常慢。 以下代码从我的数据上下文中获取“相册”对象的集合,并转换为相当简单的数据库联接: // Get the albums var albums = await this.context.Albums .Where(x => x.Artist.ID == artist.ID) .ToListAsync(); 这是创建的SQL: exec sp_executesql N'SELECT [Extent1].[ID] AS [ID], [Extent1].[URL] AS [URL], [Extent1].[ASIN] AS [ASIN], [Extent1].[Title] AS [Title], [Extent1].[ReleaseDate] AS [ReleaseDate], [Extent1].[AccurateDay] AS [AccurateDay], [Extent1].[AccurateMonth] AS [AccurateMonth], [Extent1].[Type] AS [Type], [Extent1].[Tracks] AS …

1
如何获得等待的Thread.Sleep?
我正在写一个基于等待/睡眠模式的网络绑定应用程序。 有时会发生连接错误,以我的经验,等待一段时间然后再次重试操作是值得的。 问题是,如果我在wait / async中使用Thread.Sleep或其他类似的阻止操作,它将阻止调用者线程中的所有活动。 我应该用Thread.Sleep(10000)代替以达到与 await Thread.SleepAsync(10000) ? 更新 我希望这样做而不创建任何其他线程的答案

7
如何等待异步方法完成?
我正在编写一个WinForms应用程序,该应用程序将数据传输到USB HID类设备。我的应用程序使用了出色的Generic HID库v6.0,可以在这里找到。简而言之,当我需要将数据写入设备时,这就是被调用的代码: private async void RequestToSendOutputReport(List<byte[]> byteArrays) { foreach (byte[] b in byteArrays) { while (condition) { // we'll typically execute this code many times until the condition is no longer met Task t = SendOutputReportViaInterruptTransfer(); await t; } // read some data from device; we need to wait …

5
带有异步Lambda的并行foreach
我想并行处理一个集合,但是在实现它时遇到了麻烦,因此希望获得一些帮助。 如果要在并行循环的lambda中调用C#中标记为async的方法,则会出现问题。例如: var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, async item => { // some pre stuff var response = await GetData(item); bag.Add(response); // some post stuff } var count = bag.Count; 计数为0时会发生问题,因为创建的所有线程实际上都是后台线程,并且Parallel.ForEach调用不等待完成。如果删除async关键字,则该方法如下所示: var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, item => { // some pre stuff var responseTask = await GetData(item); …

5
在.net 4上使用async-await
我目前正在开始创建一个将从C#5的async-await功能中受益匪浅的应用程序。但是我不确定要使用哪个版本的VS和异步运行时。 查看OS流行度图表,我需要再支持Windows XP三年左右。看起来.net 4.5仅在更新版本的Windows上运行,因此我需要定位.net 4.0。开发机器使用Windows 7,因此使用较新版本的VS没问题。 现在,我需要首先选择一个编译器来执行此操作: 带有AsyncCTP的VS2010 VS2012预览版(到达后即为最终版本),将目标设置为.net 4.0 Mono(看起来像2.12具有async-await,我更喜欢/ am习惯于使用VS取代MonoDevelop作为IDE) 哪一个代码错误较少?在Jon Skeet的博客中,VS2012 Preview使用的永远不会是CTP的代码生成器。 更重要的是要使用哪个运行时? VS2012是否包含可与.net 4一起使用的可重新分发的异步运行时? 通过引用AsyncCTP运行时,我设法通过预览来编译代码。但是,由于CTP具有奇怪的许可条件,因此这似乎不是一个好的长期解决方案。 还是应该使用第三方实现?也许单声道有一个? 为了分发库,我更喜欢将dll与应用程序放在同一目录中,而不是某种安装程序。 如果我的二进制文件可以在mono + Linux / MacOS上运行而无需更改,我也很喜欢。因此,运行时应该与内置的mono(可能为2.12)兼容,或者允许在非Windows操作系统上使用。

10
警告未等待此调用,继续执行当前方法
刚拿到VS2012并试图了解async。 假设我有一个从阻塞源获取一些值的方法。我不希望该方法的调用者阻塞。我可以编写该方法以接收值到达时调用的回调,但是由于我使用的是C#5,因此我决定使该方法异步,以便调用者不必处理回调: // contrived example (edited in response to Servy's comment) public static Task<string> PromptForStringAsync(string prompt) { return Task.Factory.StartNew(() => { Console.Write(prompt); return Console.ReadLine(); }); } 这是一个调用它的示例方法。如果PromptForStringAsync不是异步的,则此方法将需要在回调中嵌套一个回调。使用异步,我可以用这种非常自然的方式编写方法: public static async Task GetNameAsync() { string firstname = await PromptForStringAsync("Enter your first name: "); Console.WriteLine("Welcome {0}.", firstname); string lastname = await PromptForStringAsync("Enter …
135 c#  async-await 

2
如何实现异步动作委托方法?
一点背景资料。 我正在学习Web API堆栈,并且正在尝试以带有诸如Success和ErrorCodes之类的参数的“结果”对象的形式封装所有数据。 但是,不同的方法将产生不同的结果和错误代码,但是结果对象通常将以相同的方式实例化。 为了节省时间并进一步了解C#中的异步/等待功能,我试图将Web api操作的所有方法体包装在异步操作委托中,但遇到了一些麻烦... 给定以下类别: public class Result { public bool Success { get; set; } public List<int> ErrorCodes{ get; set; } } public async Task<Result> GetResultAsync() { return await DoSomethingAsync<Result>(result => { // Do something here result.Success = true; if (SomethingIsTrue) { result.ErrorCodes.Add(404); result.Success = false; } …

5
异步等待返回任务
有人可以解释一下同步方法意味着什么吗?如果我尝试将方法更改为,async则VS会抱怨它。 这有效: public Task MethodName() { return Task.FromResult<object>(null); } 这不起作用: public async Task MethodName() { return Task.FromResult<object>(null); } 所以基本上我想知道这到底意味着什么: Task.FromResult<object>(null);

3
.Net 4.5中的异步HttpClient对于密集负载应用程序是否是错误的选择?
我最近创建了一个简单的应用程序来测试HTTP调用吞吐量,该应用程序可以以异步方式与传统的多线程方法生成。 该应用程序能够执行预定义数量的HTTP调用,最后显示执行它们所需的总时间。在我的测试期间,所有HTTP调用都对我的本地IIS服务器进行,​​他们检索了一个小的文本文件(大小为12个字节)。 下面列出了异步实现的代码中最重要的部分: public async void TestAsync() { this.TestInit(); HttpClient httpClient = new HttpClient(); for (int i = 0; i < NUMBER_OF_REQUESTS; i++) { ProcessUrlAsync(httpClient); } } private async void ProcessUrlAsync(HttpClient httpClient) { HttpResponseMessage httpResponse = null; try { Task<HttpResponseMessage> getTask = httpClient.GetAsync(URL); httpResponse = await getTask; Interlocked.Increment(ref _successfulCalls); } …

10
在node.js中通过async / await使用文件系统
我想对一些文件系统操作使用异步/等待。由于我使用,通常async / await可以正常工作babel-plugin-syntax-async-functions。 但是使用此代码,我遇到了if情况,其中where names未定义: import fs from 'fs'; async function myF() { let names; try { names = await fs.readdir('path/to/dir'); } catch (e) { console.log('e', e); } if (names === undefined) { console.log('undefined'); } else { console.log('First Name', names[0]); } } myF(); 当我将代码重建到回调地狱版本时,一切正常,并且得到文件名。感谢您的提示。

5
为什么我要在多个等待中选择一个“等待任务.WhenAll”?
如果我不在乎任务完成的顺序,而只需要全部完成,我还是应该使用await Task.WhenAll而不是多个await?例如,DoWork2下面是一种首选方法DoWork1(为什么?): using System; using System.Threading.Tasks; namespace ConsoleApp { class Program { static async Task<string> DoTaskAsync(string name, int timeout) { var start = DateTime.Now; Console.WriteLine("Enter {0}, {1}", name, timeout); await Task.Delay(timeout); Console.WriteLine("Exit {0}, {1}", name, (DateTime.Now - start).TotalMilliseconds); return name; } static async Task DoWork1() { var t1 = DoTaskAsync("t1.1", …

5
'await'有效,但调用task.Result挂起/死锁
我有以下四个测试,运行时最后一个挂起。为什么会这样: [Test] public void CheckOnceResultTest() { Assert.IsTrue(CheckStatus().Result); } [Test] public async void CheckOnceAwaitTest() { Assert.IsTrue(await CheckStatus()); } [Test] public async void CheckStatusTwiceAwaitTest() { Assert.IsTrue(await CheckStatus()); Assert.IsTrue(await CheckStatus()); } [Test] public async void CheckStatusTwiceResultTest() { Assert.IsTrue(CheckStatus().Result); // This hangs Assert.IsTrue(await CheckStatus()); } private async Task<bool> CheckStatus() { var restClient = new …
126 c#  nunit  task  deadlock  async-await 

7
如何在ForEach中使用Async?
使用ForEach时是否可以使用Async?下面是我正在尝试的代码: using (DataContext db = new DataLayer.DataContext()) { db.Groups.ToList().ForEach(i => async { await GetAdminsFromGroup(i.Gid); }); } 我收到错误消息: 名称“异步”在当前上下文中不存在 包含using语句的方法设置为async。
123 c#  async-await 

8
SyntaxError:意外的令牌功能-异步等待Node.js
我正在尝试将Node 6.2.1版与一些代码一起使用。计划将大多数面向超级回调的代码迁移到看起来更干净甚至性能更好的代码上。 我不知道为什么,当我尝试执行节点代码时,终端抛出一个错误。 helloz.js (async function testingAsyncAwait() { await console.log("Print me!"); })(); 日志- BOZZMOB-M-T0HZ:rest bozzmob$ node helloz.js /Users/bozzmob/Documents/work/nextgennms/rest/helloz.js:1 (function (exports, require, module, __filename, __dirname) { (async function testingAsyncAwait() { ^^^^^^^^ SyntaxError: Unexpected token function at Object.exports.runInThisContext (vm.js:53:16) at Module._compile (module.js:513:28) at Object.Module._extensions..js (module.js:550:10) at Module.load (module.js:458:32) at tryModuleLoad (module.js:417:12) at …

3
在MVC5中使用异步的优势是什么?
之间有什么区别? public ActionResult Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe); if (result.Success) { return Redirect("~/home"); } else { AddErrors(result); } } return View(model); } 和: [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { IdentityResult result = …

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.