Tag: async await

如果我等待我正在执行ReadAsStringAsync()的响应,我应该等待ReadAsStringAsync()吗?

如果我等待我正在执行ReadAsStringAsync()的响应,我应该等待 ReadAsStringAsync()吗? 为了进一步澄清,以下两者之间的区别或正确方法是什么? 它们实际上是一样的吗? var response = await httpClient.GetAsync(“something”); var content = await response.Content.ReadAsStringAsync(); return new AvailableViewingTimesMapper().Map(content); 要么 var response = await httpClient.GetAsync(“something”); var content = response.Content.ReadAsStringAsync(); return new AvailableViewingTimesMapper().Map(content.Result);

使用asyc await从事件更新UI

我试图了解如何在使用async / await模式时从事件更新UI。 下面是我在WinForm应用程序上使用的测试代码。 我甚至不确定这是正确的方法。 允许pwe_StatusUpdate方法更新UI有什么必要? 抛出跨线程操作错误。 谢谢阅读。 // calling code ProcessWithEvents pwe = new ProcessWithEvents(); pwe.StatusUpdate += pwe_StatusUpdate; await pwe.Run(); void pwe_StatusUpdate(string updateMsg) { // Error Here: Cross-thread operation not valid: Control ‘_listBox_Output’ accessed from a thread other than the thread it was created on. _listBox_Output.Items.Add(updateMsg); } – // Class with long running process […]

在一次设置最大运行任务时等待多个异步任务

所以我刚开始尝试理解异步,任务,lambda等等,我无法让它像我想的那样工作。 使用下面的代码我希望它能锁定btnDoWebRequest,将一个未知数量的WebRequests作为任务执行,并且一旦所有任务完成,就解锁btnDoWebRequest。 但是我只希望最多3个或者我一次运行的任务数量,这部分来自于我有一组任务,一次只运行X. 但是在以多种方式尝试和修改我的代码之后,它将始终立即跳回并重新启用btnDoWebRequest。 当然VS警告我需要等待,目前在“.ContinueWith((任务)”和“await Task.WhenAll(requestInfoList .Select(async i =>”)中的异步,但似乎无法工作在哪里或如何投入所需的等待。当然,因为我仍然在学习,所以我很有可能在这一切都错了,整个事情需要重新修改。所以任何帮助都将非常感激。 谢谢 private SemaphoreSlim maxThread = new SemaphoreSlim(3); private void btnDoWebRequest_Click(object sender, EventArgs e) { btnDoWebRequest.Enabled = false; Task.Factory.StartNew(async () => await DoWebRequest()).Wait(); btnDoWebRequest.Enabled = true; } private async Task DoWebRequest() { List requestInfoList = new List(); for (int i = 0; dataRequestInfo.RowCount – 1 > i; […]

在MVC 4 Controller中异步并等待

每次我尝试使用新的Async和Await运算符并从数据库返回一组对象时,我都会收到Invalid Operationexception。 当我使用它只返回一个项目时它工作正常。 控制器代码: public async Task EnvironmentList() { EfEnvironmentDataAccess dataAccess = new EfEnvironmentDataAccess(); ICollection environments = await dataAccess.GetAllEnvironmentsAsync(); return PartialView(environments); } 查看代码: Table Dumps @Html.Action(“EnvironmentList”, “Environment”) @Html.Action(“ComputerList”, “Computer”) @Html.Action(“ProductList”, “Product”) @Html.Action(“InstanceList”, “Instance”) @Html.Action(“ProfileList”, “Profile”) 数据访问代码: public ICollection GetAllEnvironments() { using (EcuWebDataContext db = new EcuWebDataContext()) { return db.Environments.OrderBy(e => e.Name).ToList(); } } public async […]

异步和线程文化

我有一个MVC应用程序,我覆盖我的基本控制器的OnActionExecuting()方法来设置我的线程文化: protected override void OnActionExecuting(ActionExecutingContext filterContext) { var langCode = GetLangCode(); Thread.CurrentThread.CurrentUICulture = new CultureInfo(langCode); Thread.CurrentThread.CurrentCulture = new CultureInfo(langCode); } 当我开始异步编程时,如果我们将我们修改过的文化返回到线程池,并且在异步任务完成时调度新线程,我很好奇文化是如何持久化的? 我应该知道的任何陷阱?

异步等待与GetAwaiter()。GetResult()和回调

我正在努力为我的一个项目寻找最佳实践。 它是一个典型的WPF应用程序,其UI显示项目列表,并且有一个返回结果的数据服务。 我们异步调用服务,以便不阻止UI。 我们面前有两个选择: 使用Async await关键字这需要标记所有方法Async from button按钮一直点击到服务层(客户端上的类调用服务器的http)以及其间的任何方法。 除了在任何地方传播异步的问题之外,这种方法工作正常 使用awaiter和callback在这种方法中,UI客户端调用服务层并将回调传递给服务层,服务层将http调用包装到任务中的服务器并使用GetAwaiter()。GetResult(),当http调用时完成它会调用UI客户端传递的回调。 在这种情况下,没有方法必须标记为异步,但不确定GetAwaiter()的使用 Task.Run(async()=> //等待http调用,调用回调).GetAwaiter()。GetResult(); 我只是想找出哪种方法更好,如果有任何方法存在问题我应该注意

如果我正在返回一个任务而不是等待任何事情,我应该使用异步

在异步方法中代码没有await任何东西,是否有人将其标记为异步,等待任务,然后返回? 除了潜在的不必要之外,这样做的负面影响是什么? 对于此示例,请假设QueryAsync返回Task 。 private static async Task InsertRecord_AsyncKeyword(SqlConnection openConnection) { int autoIncrementedReferralId = await openConnection.QueryAsync(@” INSERT INTO… SELECT CAST(SCOPE_IDENTITY() AS int)” ); return autoIncrementedReferralId; } private static Task InsertRecord_NoAsyncKeyword(SqlConnection openConnection) { Task task = openConnection.QueryAsync(@” INSERT INTO… SELECT CAST(SCOPE_IDENTITY() AS int)” ); return task; } // Top level method using (SqlConnection connection = await […]

异步等待创建文件

await外部应用程序创建文件的最简洁方法是什么? async Task doSomethingWithFile(string filepath) { // 1. await for path exists // 2. Do something with file }

正确取消异步操作并再次触发

如何处理用户可能点击按钮的情况,该按钮多次调用长时间运行的异步操作。 我的想法是首先检查异步操作是否正在运行,取消它并再次触发它。 到目前为止,我已尝试使用CancellationTokenSource构建此类function,但它没有按预期工作。 有时会运行两个异步操作,因此当我启动新的操作时,“旧的”异步操作不会被取消,这会混合处理结果。 任何建议或例子如何处理这种情况? public async void Draw() { bool result = false; if (this.cts == null) { this.cts = new CancellationTokenSource(); try { result = await this.DrawContent(this.TimePeriod, this.cts.Token); } catch (Exception ex) {} finally { this.cts = null; } } else { this.cts.Cancel(); this.cts = new CancellationTokenSource(); try { result = await this.DrawContent(this.TimePeriod, […]

HttpClient不能正确序列化XML

在调用HttpClient的扩展方法PostAsXmlAsync ,它会忽略该类的XmlRootAttribute 。 这种行为是个错误吗? 测试 [Serializable] [XmlRoot(“record”)] class Account { [XmlElement(“account-id”)] public int ID { get; set } } var client = new HttpClient(); await client.PostAsXmlAsync(url, new Account())