1

MCSD 試験の一部である非同期呼び出しについてもっと学ぼうとしています。http://msdn.microsoft.com/en-gb/library/2e08f6yc.aspxのページのすべての例にうまく従いました。

すべての例で、コンソール アプリケーションと Winform アプリケーションを作成しました。ただし、最後の例 (非同期呼び出しの完了時にコールバック メソッドを実行する) では、WinForm アプリケーションが使用されている場合、コールバック関数は呼び出されません。以下のコードを参照してください。

Imports System
Imports System.Threading
Imports System.Runtime.InteropServices

Public Class AsyncDemo
    ' The method to be executed asynchronously.
    '
    Public Function TestMethod(ByVal callDuration As Integer, _
            <Out()> ByRef threadId As Integer) As String
        Console.WriteLine("Test method begins.")
        Thread.Sleep(callDuration)
        threadId = AppDomain.GetCurrentThreadId()
        Return "MyCallTime was " + callDuration.ToString()
    End Function
End Class

' The delegate must have the same signature as the method
' you want to call asynchronously.
Public Delegate Function AsyncDelegate(ByVal callDuration As Integer, _
    <Out()> ByRef threadId As Integer) As String

Public Class AsyncMain
    ' The asynchronous method puts the thread id here.
    Private Shared threadId As Integer

    Shared Sub Main()
        ' Create an instance of the test class.
        Dim ad As New AsyncDemo()

        ' Create the delegate.
        Dim dlgt As New AsyncDelegate(AddressOf ad.TestMethod)

        ' Initiate the asynchronous call.
        Dim ar As IAsyncResult = dlgt.BeginInvoke(3000, _
            threadId, _
            AddressOf CallbackMethod, _
            dlgt)

        Console.WriteLine("Press Enter to close application.")
        Console.ReadLine()
    End Sub

    ' Callback method must have the same signature as the
    ' AsyncCallback delegate.
    Shared Sub CallbackMethod(ByVal ar As IAsyncResult)
        ' Retrieve the delegate.
        Dim dlgt As AsyncDelegate = CType(ar.AsyncState, AsyncDelegate)

        ' Call EndInvoke to retrieve the results.
        Dim ret As String = dlgt.EndInvoke(threadId, ar)

        Console.WriteLine("The call executed on thread {0}, with return value ""{1}"".", threadId, ret)
    End Sub
End Class

WinFormアプリケーションでCallbackMethodに到達しないのはなぜですか? コンソール アプリケーションと WinForm アプリケーションの違いを理解していることに注意してください。

4

1 に答える 1

2

問題は、Console.ReadLine(). WinForms アプリでは、この呼び出しはブロックされません。代わりに、Thread.Sleep(Timeout.Infinite)またはニーズに最も適したものを使用できます。

于 2013-02-26T14:57:34.597 に答える