VB.NET中,如何避免使用Async-await导致界面UI卡顿?

2026-05-08 12:123阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计419个文字,预计阅读时间需要2分钟。

VB.NET中,如何避免使用Async-await导致界面UI卡顿?

我拥有这个功能:冻结UI。

公共子程序 ValidateUrlContentAsync(外部应用URL作为字符串)

AsyncManager.OutstandingOperations.Increment()

Dim result As Threading.Tasks.Task=Threading.Tasks.Task.Run( Async Function() Return Await ValidateLinks.ValidateUrlCon End Function)

我有这个功能冻结UI:

Public Sub ValidateUrlContentAsync(externalApplyURL As String) AsyncManager.OutstandingOperations.Increment() Dim result = Threading.Tasks.Task. Run( _ Async Function() Return Await ValidateLinks.ValidateUrlContentAsync(externalApplyURL) End Function). ContinueWith( Sub(t) Try If t.IsFaulted Then Throw t.Exception End If If t.Result.Error IsNot Nothing Then ErrorHandler.Log.Warn( String.Format("ValidationError: {0}, Exception: {1}", externalApplyURL, t.Result.Error)) End If AsyncManager.Parameters("validationResult") = t.Result.ResultValue.ToString() Finally AsyncManager.OutstandingOperations.Decrement() End Try End Sub) End Sub Public Function ValidateUrlContentCompleted(validationResult As String) As ActionResult Return Json(validationResult, JsonRequestBehavior.AllowGet) End Function

我认为task.run解决了这个问题,因为它创建了一个与UI线程分离的新线程,这段代码出了什么问题?

有一点让我感到惊讶的是使用三个独立的异步代码模式(Await,ContinueWith和AsyncManager)而不仅仅是使用Await.

另一个主要的事情是你正在返回一个ActionResult – 表明这是一个ASP.NET应用程序 – 而且还在谈论一个“UI线程”. ASP.NET上没有UI线程.

因此,我重新解释“冻结UI”为“在处理程序完成之前不返回结果”,这正是ASP.NET应该如何工作的.

因此,首先,删除所有不必要的AsyncManager,ContinueWith和Task.Run代码,这真正简化了方法:

VB.NET中,如何避免使用Async-await导致界面UI卡顿?

Public Function ValidateUrlContent(externalApplyURL As String) As Task(Of ActionResult) Dim result = Await ValidateLinks.ValidateUrlContentAsync(externalApplyURL) If result.Error IsNot Nothing Then ErrorHandler.Log.Warn(String.Format("ValidationError: {0}, Exception: {1}", externalApplyURL, result.Error)) End If Return Json(result.ResultValue.ToString(), JsonRequestBehavior.AllowGet) End Function

接下来,解决“冻结UI”问题.解决此问题的适当位置是在UI中,而不是在服务器(ASP.NET)端.防止UI冻结的方法是以异步方式调用服务器.如果UI是.NET应用程序,则可以使用Await和HttpClient异步调用它.

本文共计419个文字,预计阅读时间需要2分钟。

VB.NET中,如何避免使用Async-await导致界面UI卡顿?

我拥有这个功能:冻结UI。

公共子程序 ValidateUrlContentAsync(外部应用URL作为字符串)

AsyncManager.OutstandingOperations.Increment()

Dim result As Threading.Tasks.Task=Threading.Tasks.Task.Run( Async Function() Return Await ValidateLinks.ValidateUrlCon End Function)

我有这个功能冻结UI:

Public Sub ValidateUrlContentAsync(externalApplyURL As String) AsyncManager.OutstandingOperations.Increment() Dim result = Threading.Tasks.Task. Run( _ Async Function() Return Await ValidateLinks.ValidateUrlContentAsync(externalApplyURL) End Function). ContinueWith( Sub(t) Try If t.IsFaulted Then Throw t.Exception End If If t.Result.Error IsNot Nothing Then ErrorHandler.Log.Warn( String.Format("ValidationError: {0}, Exception: {1}", externalApplyURL, t.Result.Error)) End If AsyncManager.Parameters("validationResult") = t.Result.ResultValue.ToString() Finally AsyncManager.OutstandingOperations.Decrement() End Try End Sub) End Sub Public Function ValidateUrlContentCompleted(validationResult As String) As ActionResult Return Json(validationResult, JsonRequestBehavior.AllowGet) End Function

我认为task.run解决了这个问题,因为它创建了一个与UI线程分离的新线程,这段代码出了什么问题?

有一点让我感到惊讶的是使用三个独立的异步代码模式(Await,ContinueWith和AsyncManager)而不仅仅是使用Await.

另一个主要的事情是你正在返回一个ActionResult – 表明这是一个ASP.NET应用程序 – 而且还在谈论一个“UI线程”. ASP.NET上没有UI线程.

因此,我重新解释“冻结UI”为“在处理程序完成之前不返回结果”,这正是ASP.NET应该如何工作的.

因此,首先,删除所有不必要的AsyncManager,ContinueWith和Task.Run代码,这真正简化了方法:

VB.NET中,如何避免使用Async-await导致界面UI卡顿?

Public Function ValidateUrlContent(externalApplyURL As String) As Task(Of ActionResult) Dim result = Await ValidateLinks.ValidateUrlContentAsync(externalApplyURL) If result.Error IsNot Nothing Then ErrorHandler.Log.Warn(String.Format("ValidationError: {0}, Exception: {1}", externalApplyURL, result.Error)) End If Return Json(result.ResultValue.ToString(), JsonRequestBehavior.AllowGet) End Function

接下来,解决“冻结UI”问题.解决此问题的适当位置是在UI中,而不是在服务器(ASP.NET)端.防止UI冻结的方法是以异步方式调用服务器.如果UI是.NET应用程序,则可以使用Await和HttpClient异步调用它.