如何在ASP.NET WebForms应用程序中异步创建COM组件?

时间:2014-11-21 14:53:59

标签: asp.net asynchronous com

我试图异步创建一个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

0 个答案:

没有答案