Как я могу вызвать метод XmlDocument.Load асинхронно? - PullRequest
0 голосов
/ 31 августа 2011

У меня есть рабочий код для чтения RSS-канала, который использует:

Dim doc As New XmlDocument
doc.Load("http://...")
Dim channel As XmlElement = doc("rss")("channel")
Dim items As XmlNodeList = channel.GetElementsByTagName("item")

К сожалению, вызов doc.Load приводит к тому, что остальная часть программы перестает отвечать на запросы до ее завершения.

Какой лучший способ выполнить загрузку асинхронно и иметь функцию обратного вызова для обработки данных?

Редактировать : Вот код, который я пытался использовать с помощью WebClient - метод Load все еще отстает:

Private Sub checkResults()
    'request rss feed
    Dim w As New System.Net.WebClient
    AddHandler w.OpenReadCompleted, AddressOf rssReadCallback
    w.OpenReadAsync(New Uri("http://..."))
End Sub

Private Sub rssReadCallback(ByVal sender As Object, ByVal e As System.Net.OpenReadCompletedEventArgs)
    Dim reply As Stream = Nothing

    Try
        reply = CType(e.Result, Stream)

        Dim doc As New XmlDocument
        doc.Load(reply) ' This line takes forever to complete
        Dim channel As XmlElement = doc("rss")("channel")
        Dim items As XmlNodeList = channel.GetElementsByTagName("item")

        '...


    Finally
        If Not reply Is Nothing Then
            reply.Close()
        End If
    End Try

Метод rssReadCallback выполняется довольно быстро после вызова checkResults, но затем пользовательский интерфейс останавливается во время метода Load.

Ответы [ 2 ]

4 голосов
/ 31 августа 2011

Я не верю, что в самой XmlDocument есть встроенная асинхронная функциональность, но вы можете легко использовать пул потоков (или библиотеку параллельных задач, если вы используете .NET 4) для загрузки документа в фоновом режимепоток, как и любая другая длительная операция.Затем вы можете выполнить обратный вызов в потоке пользовательского интерфейса для обработки документа при его загрузке.

(Если вы используете .NET 4, я настоятельно рекомендую использовать XDocument вместо XmlDocument; LINQ to XML - прекрасный API.)

Другой вариант - использовать WebClient, чтобы сначала загрузить документ, а затем загрузить его, когда он ужев памяти - WebClient уже поддерживает асинхронные операции, поэтому вы можете просто добавить соответствующие обработчики событий, и они будут автоматически выполняться в вашем потоке пользовательского интерфейса.

1 голос
/ 31 августа 2011

Вы можете загрузить его в другой поток. У Microsoft есть KB, объясняющая, как использовать потоки с Visual Basic .NET:

http://support.microsoft.com/kb/315577

...