我试图异步创建一个ASP.NET WebForms应用程序的COM组件。
我似乎遇到了冲突。
为了运行异步方法,我需要指定@Page
指令:Async="True"
<%@ Page Inherits="HealthCheck.HealthCheck" Title="Health Check" Language="VB" AutoEventWireup="true" MasterPageFile="Site.Master" CodeBehind="HealthCheck.aspx.vb" Async="true" %>
当我这样做时,收到以下消息:
Apartment threaded components can only be created on pages with an page directive.
这导致我指定@Page
指令:AspCompat="True"
结果是:
Async attribute cannot be set to true when AspCompat mode is enabled.
这似乎是一个问题22.有没有人对我如何做到这一点有任何建议?请注意,请不要在答案中使用VB。我精通VB和C#,并乐意接受其中任何一个的答案。谢谢!
代码:
Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
DetailedCheck()
End Sub
Private Async Sub DetailedCheck()
Dim lstComponentTasks As New List(Of Task(Of Component))
For Each key As String In ConfigurationManager.AppSettings.AllKeys()
lstComponentTasks.Add(GetComponentTaskAsync(key))
Next
Await Task.WhenAll(lstComponentTasks)
Dim lstComponents As List(Of Component) = (From lstComponentTask In lstComponentTasks Select lstComponentTask.Result).ToList()
If lstComponents.Any(Function(x) x.ResponseStatusCode = 555) Then
Response.StatusCode = 555
End If
lvComponents.DataSource = lstComponents.OrderBy(Function(com) com.Name)
lvComponents.DataBind()
End Sub
Private Function GetComponentTaskAsync(name As String) As Task(Of Component)
Return Task.Run(Of Component)(Function()
Return GetComponent(name)
End Function)
End Function
Private Function GetComponent(name As String) As Component
Dim component As New Component With {.Name = name}
Try
Dim objComponent = Server.CreateObject(name)
component.Status = "VALID"
Catch ex As Exception
component.ResponseStatusCode = 555
component.Status = ex.Message
End Try
Return component
End Function
Public Class Component
Property Name() As String
Property Status() As String
Property ResponseStatusCode() As Integer
End Class