Tag: async await

将async / await转换为Task.ContinueWith

这个问题是由对这个问题的评论引发的: 如何在没有Microsoft.Bcl.Async情况下将非线性async/await代码反向移植到.NET 4.0? 在链接的问题中,我们有一个WebRequest操作,如果它一直失败,我们想要重试有限次数。 Async/await代码可能如下所示: async Task GetResponseWithRetryAsync(string url, int retries) { if (retries < 0) throw new ArgumentOutOfRangeException(); var request = WebRequest.Create(url); while (true) { WebResponse task = null; try { task = request.GetResponseAsync(); return (HttpWebResponse)await task; } catch (Exception ex) { if (task.IsCanceled) throw; if (–retries == 0) throw; // rethrow last error […]

GetResponseAsync不接受cancellationToken

似乎GetResponseAsync在Async / Await中不接受cancellationToken。 所以问题是我如何取消以下程序,只要我需要从响应中收集Cookie: using (HttpWebResponse response = (HttpWebResponse) await request.GetResponseAsync()) { cookies.Add(response.Cookies); } 实现上述目标的替代代码也是受欢迎的。

等待FormClosing事件中的异步函数

我遇到了一个问题,我无法等待FormClosing事件中的异步函数,这将决定表单关闭是否应该继续。 我创建了一个简单的示例,如果您在未保存的情况下关闭,则会提示您保存未保存的更改(非常类似于记事本或Microsoft Word)。 我遇到的问题是,当我等待异步保存function时,它会在保存function完成之前关闭表单,然后在完成后返回结束function并尝试继续。 我唯一的解决方案是在调用SaveAsync之前取消关闭事件,然后如果保存成功,它将调用form.Close()函数。 我希望有一种更清洁的方式来处理这种情况。 要复制方案,请创建一个带有文本框(txtValue),复选框(cbFail)和按钮(btnSave)的表单。 这是表单的代码。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TestZ { public partial class Form1 : Form { string cleanValue = “”; public Form1() { InitializeComponent(); } public bool HasChanges() { return (txtValue.Text != cleanValue); } public […]

再访问​​Task.ConfigureAwait(continueOnCapturedContext:false)

太久阅读了。 使用Task.ConfigureAwait(continueOnCapturedContext: false)可能会引入冗余线程切换。 我正在寻找一致的解决方案。 长版。 ConfigureAwait(false)背后的主要设计目标是尽可能减少用于await冗余SynchronizationContext.Post连续回调。 这通常意味着更少的线程切换和更少的UI线程工作。 但是,它并不总是如何运作。 例如,有一个实现SomeAsyncApi API的第三方库。 请注意,由于某些原因,此库中的任何位置都不使用ConfigureAwait(false) : // some library, SomeClass class public static async Task SomeAsyncApi() { TaskExt.Log(“X1”); // await Task.Delay(1000) without ConfigureAwait(false); // WithCompletionLog only shows the actual Task.Delay completion thread // and doesn’t change the awaiter behavior await Task.Delay(1000).WithCompletionLog(step: “X1.5”); TaskExt.Log(“X2”); return 42; } // logging helpers […]

如何使用call / cc实现c#5.0中的新异步function?

我一直在关注有关c#5.0中新的asyncfunction的新公告。 我对继续传递样式以及新的c#编译器对Eric Lippert的post中的代码片段所做的转换有基本的了解: async void ArchiveDocuments(List urls) { Task archive = null; for(int i = 0; i < urls.Count; ++i) { var document = await FetchAsync(urls[i]); if (archive != null) await archive; archive = ArchiveAsync(document); } } 我知道有些语言通过call-with-current-continuation( callcc )本地实现continuation,但我真的不明白它是如何工作的或者它究竟是做什么的。 所以这就是问题:如果安德斯等人。 我决定咬紧牙关,只是在c#5.0中实现callcc而不是async / await特殊情况,上面的代码片段会是什么样子?

用于自动取消和重新启动任务的模式

是否有建议的自我取消和重启任务模式? 例如,我正在研究背景拼写检查程序的API。 拼写检查会话被包装为Task 。 每个新会话都应该取消之前的会话并等待其终止(正确地重新使用拼写检查服务提供商等资源)。 我想出了这样的事情: class Spellchecker { Task pendingTask = null; // pending session CancellationTokenSource cts = null; // CTS for pending session // SpellcheckAsync is called by the client app public async Task SpellcheckAsync(CancellationToken token) { // SpellcheckAsync can be re-entered var previousCts = this.cts; var newCts = CancellationTokenSource.CreateLinkedTokenSource(token); this.cts = newCts; […]

使用void进行异步exception处理

我正在使用Async CTP编写IO重型控制台应用程序。 但我遇到exception问题。 public static void Main() { while (true) { try{ myobj.DoSomething(null); } catch(Exception){} Console.Write(“done”); //… } } //… public async void DoSomething(string p) { if (p==null) throw new InvalidOperationException(); else await SomeAsyncMethod(); } 并发生以下情况:“完成”被写入控制台,然后我在调试器中得到exception,然后我按继续我的程序存在 。 是什么赋予了?

取消不接受CancellationToken的异步操作的正确方法是什么?

取消以下内容的正确方法是什么? var tcpListener = new TcpListener(connection); tcpListener.Start(); var client = await tcpListener.AcceptTcpClientAsync(); 简单地调用tcpListener.Stop()似乎会导致ObjectDisposedException ,而AcceptTcpClientAsync方法不接受CancellationToken结构。 我完全错过了一些明显的东西吗

在Razor视图中使用await

是否可以await Razor .cshtml视图中的任务? 默认情况下它抱怨它只能用于标记为async方法,所以我想知道是否有一个隐藏的开关可以启用它?

为什么EF 6教程使用异步调用?

关于如何将EF 6与MVC 5一起使用的最新EF教程似乎倾向于使用对数据库的asych调用,如: Department department = await db.Departments.FindAsync(id); 这是新的标准/最佳做法吗? 我不确定ASP.NET MVC的这种开发风格有什么好处。 有人可以评论这种模式,这是MS推广的新标准吗?