Tag: async await

debugging器不会在asynchronous方法中打破/停止exception

当一个debugging器连接到一个.NET进程时,它通常会在引发未处理的exception时停止。 但是,当你在一个async方法,这似乎不工作。 我以前尝试过的场景在以下代码中列出: class Program { static void Main() { // Debugger stopps correctly Task.Run(() => SyncOp()); // Debugger doesn't stop Task.Run(async () => SyncOp()); // Debugger doesn't stop Task.Run((Func<Task>)AsyncTaskOp); // Debugger stops on "Wait()" with "AggregateException" Task.Run(() => AsyncTaskOp().Wait()); // Throws "Exceptions was unhandled by user code" on "await" Task.Run(() => AsyncVoidOp()); Thread.Sleep(2000); } […]

为什么Thread.CurrentPrincipal需要“等待Task.Yield()”?

下面的代码被添加到新创build的Visual Studio 2012 .NET 4.5 WebAPI项目中。 我试图在asynchronous方法中分配HttpContext.Current.User和Thread.CurrentPrincipal 。 Thread.CurrentPrincipal的分配不正确,除非await Task.Yield(); (或其他任何asynchronous)被执行(传递true到AuthenticateAsync()将导致成功)。 这是为什么? using System.Security.Principal; using System.Threading.Tasks; using System.Web.Http; namespace ExampleWebApi.Controllers { public class ValuesController : ApiController { public async Task GetAsync() { await AuthenticateAsync(false); if (!(User is MyPrincipal)) { throw new System.Exception("User is incorrect type."); } } private static async Task AuthenticateAsync(bool yield) { if […]

不能隐式地将types“string”转换为“System.Threading.Tasks.Task <string>”

我是新来的asynchronous编程,所以经过一些asynchronous示例代码,我想写一个简单的asynchronous代码 我创build了一个简单的Winform应用程序,并在表单中写下了以下代码。 但它只是不工作 private Task<string> methodAsync() { Thread.Sleep(10000); return "Hello"; //Error: Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<string>' } private async void button1_Click(object sender, EventArgs e) { string s = await methodAsync(); MessageBox.Show(s); } 有人可以在这里放一些灯光..

asynchronous函数+ await + setTimeout的组合

我试图使用新的ES7asynchronousfunction,我希望解决我的问题将在未来帮助其他人。 这是我的代码正在工作: async function asyncGenerator() { // other code while (goOn) { // other code var fileList = await listFiles(nextPageToken); var parents = await requestParents(fileList); // other code } // other code } function listFiles(token) { return gapi.client.drive.files.list({ 'maxResults': sizeResults, 'pageToken': token, 'q': query }); } 问题是,我的循环运行速度太快,脚本每秒发送太多的请求到谷歌API。 因此,我想build立一个延迟请求的睡眠function。 因此我也可以使用这个函数来延迟其他请求。 如果还有其他方式推迟请求,请告诉我。 无论如何,这是我的新代码不起作用。 请求的响应返回给setTimeout中的匿名asynchronous函数,但我不知道如何将响应返回到睡眠函数resp。 到最初的asyncGenerator函数。 async function […]

为什么我会打扰使用Task.ConfigureAwait(continueOnCapturedContext:false);

考虑下面的Windows窗体的代码: private async void UpdateUIControlClicked(object sender, EventArgs e) { this.txtUIControl.Text = "I will be updated after 2nd await – i hope!"; await Task.Delay(5000).ConfigureAwait(continueOnCapturedContext: false); this.txtUIControl.Text = "I am updated now."; } 这里在第三行抛出exception,因为在等待代码在非UI线程上执行之后。 ConfigureAwait(false)有用吗?

使用.NETasynchronous方法可以获得一个好的堆栈跟踪吗?

我在WebApi应用程序中安装了以下示例代码: [HttpGet] public double GetValueAction() { return this.GetValue().Result; } public async Task<double> GetValue() { return await this.GetValue2().ConfigureAwait(false); } public async Task<double> GetValue2() { throw new InvalidOperationException("Couldn't get value!"); } 不幸的是,当GetValueAction被命中时,返回的堆栈跟踪是: " at MyProject.Controllers.ValuesController.<GetValue2>d__3.MoveNext() in c:\dev\MyProject\MyProject\Controllers\ValuesController.cs:line 61 — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) […]

'await'操作符只能在asynchronouslambdaexpression式中使用

我有ac#的Windowsapp store应用程序。 我试图启动一个MessageDialog时,另一个MessageDialog中的命令button之一被点击。 关键是要警告用户他们的内容是未保存的,如果他们点击取消,则会提示他们使用单独的保存对话框进行保存。 这是我的“showCloseDialog”函数: private async Task showCloseDialog() { if (b_editedSinceSave) { var messageDialog = new MessageDialog("Unsaved work detected. Close anyway?", "Confirmation Message"); messageDialog.Commands.Add(new UICommand("Yes", (command) => { // close document editor.Document.SetText(TextSetOptions.None, ""); })); messageDialog.Commands.Add(new UICommand("No", (command) => { // save document await showSaveDialog(); })); messageDialog.DefaultCommandIndex = 1; await messageDialog.ShowAsync(); } } 在VS我得到一个编译器错误: 'await'操作符只能在asynchronouslambdaexpression式中使用。 […]

asynchronous提交或回滚事务作用域

众所周知,在.NET中引入async await模式时, TransactionScope被遗忘了。 如果我们试图在事务范围内使用一些await调用,它们就会被破坏。 现在这是固定的,由于范围构造选项 。 但是在我看来,还有一个缺失的部分,至less我无法find如何在简单的“事务范围”方式中这样做:如何等待范围的提交或回滚? 提交和回滚也是IO操作,它们应该是可以等待的。 但是,由于它们是在处理范围内发生的,我们将不得不等待处置。 这看起来不可行( using模式也不实际)。 我也看了一下System.Transactions.Transaction接口:在那里也没有可以使用的方法。 我明白,提交和回滚几乎只是向数据库发送一个标志,所以它应该是快速的。 但是对于分布式交易,这可能不那么快。 无论如何,这仍然是一些封锁IO。 关于分布式病例,请记住这可能会触发两个阶段提交。 在某些情况下,在第一阶段(准备阶段)需要额外的耐用资源。 那通常意味着对最近入伍的资源发出一些额外的查询。 在提交期间发生的所有事情。 那么有什么方法可以等待事务范围吗? 还是一个System.Transactions.Transaction ? 注意:我不认为这是“ asynchronous提交/回滚SqlTransaction? ”的副本。 SqlTransaction比系统事务更有限。 他们只能解决SQL Server,并且从不分发。 其他一些事务具有asynchronous方法,如Npgsql 。 现在,对于事务范围/系统事务有asynchronous方法, DbTransaction可能需要有asynchronous方法。 (我不知道系统事务的内部,但也许是使用这个ADO.NET合约,我们把连接join系统事务的方式让我觉得它并没有使用它。

为什么ConfigureAwait(false)不是默认选项?

如您所知,在等待不需要捕获同步上下文的代码中的任务时调​​用Task.ConfigureAwait(false)是一个不错的主意,否则会导致死锁 。 那么,你需要多久才能捕获一个同步上下文呢? 我的做法很less。 在大多数情况下,我正在使用“库”代码,这几乎迫使我一直使用Task.ConfigureAwait(false) 。 所以我的问题很简单:为什么Task.ConfigureAwait(false)不是任务的默认选项? 强制“高级”代码使用Task.ConfigureAwait(true)不是更好吗? 有没有历史原因,还是我错过了什么?

如何在Python 3.5中使用async / await?

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import time async def foo(): await time.sleep(1) foo() 我不能让这个简单的例子来运行: RuntimeWarning: coroutine 'foo' was never awaited foo()