Tag: async await

等待异步谓词列表,但是先丢弃

想象一下以下课程: public class Checker { public async Task Check() { … } } 现在,想象一下这个类的实例列表: IEnumerable checkers = … 现在我想控制每个实例都将返回true : checkers.All(c => c.Check()); 现在,这将无法编译,因为Check()返回一个Task而不是bool 。 所以我的问题是:我怎样才能最好地列举检查器列表? 如果检查器返回false我怎样才能快速枚举枚举? (我认为All( )已经存在的东西)

我如何unit testing这种(正确)抛出exception的异步方法?

我在接口中有以下方法.. Task<SearchResult> SearchAsync(TU searchOptions); 效果很好。 现在我正在尝试进行unit testing以测试出现问题的时间 – 并且代码会引发exception。 在这种情况下,我设置了我的方法来抛出HttpRequestException 。 我的unit testing未能说我扔了那个例外.. var result = Should.Throw (async () => await service.SearchAsync(searchOptions)); 来自unit testing的错误消息是 Shouldly.ChuckedAWobbly var result =应该 扔 System.Net.Http.HttpRequestException 但不是 所以断言框架说: 你期望一个例外,但没有一个被抛出。 当我逐步执行代码时,exception被100%抛出。 有人能看到我的unit testing代码出错了吗?

捕获异步操作的exception

我正在阅读更多关于异步的内容: http : //msdn.microsoft.com/en-us/library/hh873173( v = vs1010) .aspx 通过这个例子: Task [] recommendations = …; while(recommendations.Count > 0) { Task recommendation = await Task.WhenAny(recommendations); try { if (await recommendation) BuyStock(symbol); break; } catch(WebException exc) { recommendations.Remove(recommendation); } } 我想知道,如果我已经在Task.WhenAny上执行等待,为什么我需要在try块内再次等待? 如果我已经这样做了: Task recommendation = await Task.WhenAny(recommendations); 为什么这样: if (await recommendation) BuyStock(symbol);

编译器是否对异步方法链执行“返回值优化”

在传统意义上没有返回值优化,但我想知道你什么时候有这样的情况: private async Task Method1() { await Method2(); } private async Task Method2() { await Method3(); } private async Task Method3() { //do something async } 这显然可以写得更优: private Task Method1() { return Method2(); } private Task Method2() { return Method3(); } private async Task Method3() { //do something async } 我只是想知道是否有人知道(MS)编译器是否足够聪明,不能在第一个实例中为Method1()和Method1()生成状态机?

对于Win 8和Win Phone 8,不能在便携式类库中使用await

我正在尝试在Visual Studio 2012中创建一个可移植类库,用于Windows 8商店应用程序和Windows Phone 8应用程序。 我收到以下错误: ‘await’要求’Windows.Foundation.IAsyncOperation’类型具有合适的GetAwaiter方法。 你错过了’系统’的使用指令吗? 在这行代码中: StorageFolder guidesInstallFolder = await Package.Current.InstalledLocation.GetFolderAsync(guidesFolder); 我的可移植类库针对Windows Framework 4.5,Windows Phone 8和.NET for Windows Store应用程序。 我没有在纯Windows Phone 8项目中获得此代码行的错误,我也没有在Windowsapp store应用中获取它,所以我不明白为什么它在我的PCL中不起作用。 GetAwaiter是WindowsRuntimeSystemExtensions类中的扩展方法,该方法位于System.Runtime.WindowsRuntime.dll中。 使用对象浏览器我可以看到这个DLL可以在.NET for Windows Store应用程序组件集和Windows Phone 8组件集中使用,但不能在.NET Portable子集中使用。 我只是不明白为什么它不会出现在Portable Subset中,如果它在我的目标平台上都可用。

为整个项目/ dll设置ConfigureAwait(false)

根据MSDN杂志上的一篇文章,最好的做法是“尽可能使用ConfigureAwait(false) ”。 此外,它指出,“如果你可以在方法中的某个时刻使用ConfigureAwait ,那么我建议你在那个点之后的那个方法中使用它。” 该文章的作者Stephen Cleary 在他的博客中指出“在你的‘库’异步方法中,尽可能使用ConfigureAwait(false)[强调添加]。” 鉴于我在广泛使用的库项目中的大部分或全部await语句都应该有.ConfigureAwait(false)是否可以执行某些操作/更改设置以使其成为我项目中await的默认行为/ dll是不是继续捕获上下文? 也就是说,我可以省略对.ConfigureAwait(false)所有调用,而只在我需要保留上下文时添加.ConfigureAwait( true ) 。

是否可以在MVC 4 AuthorizeAttribute中使用async / await?

我在MVC的AuthorizeAttribute上看到的唯一覆盖是public override void OnAuthorization( AuthorizationContext filterContext ) ,它不适合与async / await一起使用,因为它不返回Task 。 是否有另一种方法可以在MVC中创建允许使用async / await的AuthorizeAttribute ?

为什么我的异步代码在调试时同步运行?

我正在尝试使用异步function实现一个名为ReadAllLinesAsync的方法。 我已经生成了以下代码: private static async Task<IEnumerable> FileReadAllLinesAsync(string path) { using (var reader = new StreamReader(path)) { while ((await reader.ReadLineAsync()) != null) { } } return null; } private static void Main() { Button buttonLoad = new Button { Text = “Load File” }; buttonLoad.Click += async delegate { await FileReadAllLinesAsync(“test.txt”); //100mb file! MessageBox.Show(“Complete!”); }; Form […]

如何使用AsyncPump在异步控制台应用程序中保留exception上下文?

我正在使用Steven Toub优秀的AsyncPump类 ,它允许控制台应用程序使用async / await关键字。 但是,我遇到的问题是,代码中抛出的exception会被泵捕获然后重新抛出,这会导致原始调用堆栈和exception上下文丢失。 这是我的测试代码: class Program { static void Main(string[] arg) { AsyncPump.Run(() => MainAsync()); } static async Task MainAsync() { throw new Exception(); // code should break here } } 如果运行此测试,则调试器不会根据需要中断throw new Exception() 。 相反,它打破了t.GetAwaiter().GetResult() ,它是AsyncPump类本身的一部分。 这使调试应用程序非常困难。 有没有办法重新抛出exception,以便调试器在保留调用堆栈和上下文的同时在原始位置中断?

如何限制多个异步任务?

我有一些以下forms的代码: static async Task DoSomething(int n) { … } static void RunThreads(int totalThreads, int throttle) { var tasks = new List(); for (var n = 0; n < totalThreads; n++) { var task = DoSomething(n); tasks.Add(task); } Task.WhenAll(tasks).Wait(); // all threads must complete } 麻烦的是,如果我没有限制线程,事情开始崩溃。 现在,我想启动最多的throttle线程,并且只在旧线程完成时启动新线程。 我尝试过几种方法,迄今为止没有一种方法可行。 我遇到的问题包括: tasks集合必须完全填充所有任务,无论是活动还是等待执行,否则最终的.Wait()调用只会查看它所启动的线程。 链接执行似乎需要使用Task.Run()等。 但是我需要从一开始就引用每个任务,并且实例化任务似乎会自动启动它,这是我不想要的。 这该怎么做?