Tag: async await

为什么等待不等?

这是我的实际代码: async Task getData() { Thread.Sleep(5000); Console.WriteLine(“Step 1”); using (HttpClient api = new HttpClient()) await api.GetAsync(“http://google.com/”).ContinueWith( (getTask) => Console.WriteLine(getTask.Result.StatusCode); ); Console.WriteLine(“Step 2”); } private void button1_Click(object sender, EventArgs e) { Task task = new Task(getData); task.Start(); task.Wait(); Console.WriteLine(“Step 3”); } 我得到以下输出: Step 1 Step 3 OK Step 2 为什么Step 3不会在Step 2 Step 3之后出现? 如何让它按顺序工作,即只返回getData的调用者,直到getData中的所有内容都完成为止?

entity framework异步记录计数与记录

我正在尝试从数据库中获取记录,但在同一次调用DB中获取记录计数。 我的方法是异步的,所以我不确定这是否是正确的方法: public async Task<IEnumerable> GetAsync(int pageIndex, int pageSize) { var products = this.Repository.GetAll().OrderBy(p => p.Price).AsQueryable(); var count = await products.CountAsync(); if (count == 0) return new List(); products = products.ToPaginatedList(pageIndex, pageSize); var result = await products.ToListAsync(); var viewModels = new List(); Mapper.Map(result, viewModels); return viewModels.AsEnumerable(); } 我认为等待CountAsync()不太好,但我不确定如何实现它。 问候。 编辑: 我为没有在任何地方返回计数而道歉,因为它现在看起来我只计算因为== 0检查,但我最终将返回计数记录,因为我需要它为我的角度分页指令。 还没弄明白我将如何返回(新类vs元组)所以我错过了它并专注于单个数据库调用中的entity frameworkCount()和实体提取。

C#异步等待澄清?

我在这里读到: 等待检查等待它是否已经完成; 如果等待已经完成,那么该方法就会继续运行(同步,就像常规方法一样)。 什么 ? 当然它还没有完成,因为它还没有开始! 例子: public async Task DoSomethingAsync() { await DoSomething(); } 在这里await检查await它是否已经完成(根据文章),但它(DoSomething)尚未开始活动! ,结果总是 false 如果文章要说: Await检查等待是否已经在x毫秒内完成; (超时) 我可能在这里错过了什么..

在ContinueWith()块中使用await

我有以下代码: var result = MessageBoxHelper.MsgBox .ShowAsync(“Press Yes to proceed”, MessageBoxButton.YesNo) .ContinueWith((answer) => { if (answer.Result == MessageBoxResult.Yes) { Task asyncTask = ExecuteAsyncFunc(); //asyncTask.Unwrap(); ?? asyncTask.ContinueWith((a) => { // More }, TaskContinuationOptions.OnlyOnRanToCompletion); } }, TaskContinuationOptions.OnlyOnRanToCompletion); } 像这样在其他地方调用: public async Task ExecuteAsyncFunc() { await CallAnotherAsyncFunction(); } 我相信我需要调用Unwrap(),我试过,因为我在ContinueWith()块中调用await。 但是,当我取消注释时,我收到以下错误: 错误CS1929’Task’不包含’Unwrap’的定义,最好的扩展方法重载’TaskExtensions.Unwrap(Task)’需要’Task’类型的接收器 我是否需要在此上下文中使用Unwrap,如果是这样,我做错了什么?

在async / await中重入?

我有一个按钮,它有一个async处理程序,它在异步方法上调用等待。 这是它的样子: private async void Button1_OnClick(object sender, RoutedEventArgs e) { await IpChangedReactor.UpdateIps(); } 以下是IpChangedReactor.UpdateIps()外观: public async Task UpdateIps() { await UpdateCurrentIp(); await UpdateUserIps(); } 它一直是异步的。 现在我有一个DispatcherTimer ,它在tick事件中重复调用await IpChangedReactor.UpdateIps 。 假设我点击了按钮。 现在事件处理程序在UpdateIps上UpdateIps并返回到调用者,这意味着WPF将继续执行其他操作。 在此期间,如果计时器被触发,它将再次调用UpdateIps ,现在两个方法将同时运行。 所以我看到的方式是它类似于使用2个线程。 竞争条件会发生吗? (我的一部分说不,因为它都在同一个线程中运行。但它令人困惑) 我知道异步方法不一定在单独的线程上运行。 但是,在这种情况下,它非常令人困惑。 如果我在这里使用同步方法,它将按预期工作。 计时器滴答事件将仅在第一次呼叫完成后运行。 有人可以开导我吗?

按顺序执行多个异步方法调用

好像我过去曾经遇到过这个问题的答案,但现在我无法找到它。 假设我有两个异步方法,Method1和Method2。 如果我需要顺序调用Method1然后调用Method2(读取,Method1必须在Method2之前完成),以下代码是否正确? await Method1(); await Method2(); 基于此处对另一个SO问题的接受答案的信息以及MSDN文章中的信息 ,我相信这是正确的方法。 此外,此代码似乎可以工作,但我不想引入一个稍微难以追踪的微妙错误。

异步WCF方法等待后,WebOperationContext为null

在以下示例中,该方法作为WCF服务操作公开,并且该服务在IIS中承载。 在进入函数时,WebOperationContext.Current按预期设置。 然而,在await完成等待之后,WebOperationContext.Current被设置为null。 public async Task TestAsync() { //WebOperationContext.Current is set Task t = new Task(()=>Thread.Sleep(10000)); t.Start(); await t; //WebOperationContext.Current is null } 这似乎是一个缺点,所以我想知道是否有人知道这一点以及是否有任何好的方法。 我意识到我可以在局部变量中缓存对conext的引用,但这看起来不太好。 更新 一种有效的方法是 public async Task TestAsync() { WebOperationContext ctx = WebOperationContext.Current; Task t = new Task(()=>Thread.Sleep(10000)); t.Start(); await t; //ctx is set } 而且,正如其他人所暗示的那样,我可以做到这一点 public async Task TestAsync() { CallContext.LogicalSetData(“WebOperationContext.Current”, […]

异步等待在调用异步方法时返回Task <List >而不是List

我试图了解异步等待的用法,我研究了一些博客文章,现在我已经制作了一个测试代码,但它没有按照我期望的方式工作。 我有一个返回List的方法: private List GetEmployees() { IList list = new List(); list.Add(new Employee() { Id = 1, Age = 20, Name = “Kavin” }); list.Add(new Employee() { Id = 2, Age = 30, Name = “Alen” }); list.Add(new Employee() { Id = 3, Age = 20, Name = “Suresh” }); list.Add(new Employee() { Id = […]

如何在.net 4.0中使用asyn / await? AsyncTargetingPack和Microsoft.Bcl.Async之间的区别?

我想在C#4.0中使用async / await,直到知道,我已经使用了异步CTP v3,但似乎这是一个不好的选择,如果我使用VS2012则更多。 在VS2012中,至少有两个选项,Microsoft.CompilerServices.AsyncTargetingPack和Microsoft.Bcl.Async。 第一个,Microsoft.Bcl.Async(Bcl),已经发布晚于AsyncTargetingPack(ATP),但Bcl是beta。 然而,ATP适用于目标是银光5或.NET 4.0的项目,而Bcl似乎可以与银光4,银光5,Windows Phone 7.5和.NET 4.0兼容。 ATP已被弃用? 是兼容还是它们是不同的实现,如果我使用一个,我总是必须使用相同的? 哪个是最好的选择?

不包含’GetAwaiter’的定义

我用下面的代码集得到了下面的错误,这是’alliancelookup’行上的错误,我不知道我做错了什么,但我自己也看不到任何东西。 运行到顶部的查询似乎运行良好,但似乎我的问题是与Awaiter,我想知道是否有办法解决这个问题? DynamicCrest crest = new DynamicCrest(); var root = await crest.GetAsync(crest.Host); var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg(“allianceticker”).ToUpper()); allianceid = alliancelookup.id; Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:’System.Dynamic.ExpandoObject’在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite)的CallSite.Target(Closure,CallSite,Object)中不包含’GetAwaiter’的定义网站,T0 arg0)at ***。程序。 c。 d.MoveNext()在C:\ Users — \ Documents \ Visual Studio 2015 \ Projects —— \ Program.cs :第95行