0

こんにちは、Web サービスへのサービス参照を使用する WPF アプリケーションがあります...

今、私はこれの進行状況を追跡する GUI コンポーネントを持っています...

しかし、ここにはある種のバグがあるようです。一部のマシンでのみ発生し、頻繁には発生しません.. MethodNameAsync で呼び出しを開始し、一致する Completed イベントが発生するまで進行状況バーを表示します。

3 つの異なる非同期メソッドを続けて呼び出すこともありますが、そのうちの 2 つだけが Completed イベントを発生させるため、GUI がロックされ、アプリケーションを再起動する必要があります。

数週間完全にイライラした後、イベントAppDomain.CurrentDomain.FirstChanceExceptionを見つけたので、それに接続してすべてのFirstChanceExceptionsのログを記録し始めました..

2 番目のイベントが発生する前に、System.Net.Sockets.SocketException「無効な引数が指定されました」がスローされ、その後、System.ObjectDisposedException「破棄されたオブジェクトにアクセスできません」がスローされます。どちらも最初のチャンスの例外がスローされます..

これが発生した場合、wcf クライアントは 3 番目のメソッド呼び出しを忘れていると思いますが、読み込みインジケーターはそうではありません..

これは既知のバグですか、それとも何か不足していますか?

要求に応じてコードを編集します。

mCheckInService = New CheckInServiceClient()
AddHandler mCheckInService.GetPersonActivitiesCompleted, AddressOf CheckInService_GetPersonActivitiesCompleted
AddHandler mCheckInService.GetPersonArticlesCompleted, AddressOf CheckInService_GetPersonArticlesCompleted
AddHandler mCheckInService.GetPersonImageCompleted, AddressOf CheckInService_GetPersonImageCompleted


Dim workItem As WorkItem = Context.WorkDisplayService.AddWorkItem(Me, Resources.Label.DownloadingPersomImage)
mCheckInService.GetPersonImageAsync(Context.Session, person, workItem)

workItem = Context.WorkDisplayService.AddWorkItem(Me, "Hämtar aktiviteter")
mCheckInService.GetPersonActivitiesAsync(Context.Session, Person, workItem)

workItem = Context.WorkDisplayService.AddWorkItem(Me, Resources.Label.DownloadingPersonArticles)
mCheckInService.GetPersonArticlesAsync(Context.Session, person, workItem)


Private Sub CheckInService_GetPersonActivitiesCompleted(ByVal sender As Object, ByVal e As GetPersonActivitiesCompletedEventArgs)
    Dim workItem As WorkItem = CType(e.UserState, WorkItem)
    If (Context.WorkDisplayService.FinishWorkItem(Me, workItem)) Then

Private Sub CheckInService_GetPersonArticlesCompleted(ByVal sender As Object, ByVal e As GetPersonArticlesCompletedEventArgs)
    Logger.Trace("CheckInService_GetPersonArticlesCompleted()")
    Dim workItem As WorkItem = CType(e.UserState, WorkItem)
    If (Context.WorkDisplayService.FinishWorkItem(Me, workItem)) Then

Private Sub CheckInService_GetPersonImageCompleted(ByVal sender As Object, ByVal e As GetPersonImageCompletedEventArgs)
    Logger.Trace("CheckInService_GetPersonImageCompleted()")
    Dim workItem As WorkItem = CType(e.UserState, WorkItem)
    If (Context.WorkDisplayService.FinishWorkItem(Me, workItem)) Then

その GetPersonActivitiesAsync は決して完了しません..

編集:

非同期メソッドを使用せず、代わりにそれらを 1 つずつ呼び出すスレッドを使用して、この一時的な問題を修正します。これは洗練されたソリューションではありません。非同期メソッドを使用できるはずです...

4

1 に答える 1

1

ここでの手がかりは、「破棄されたオブジェクトにアクセスできません」です。

コールバック コードで時々発生するのは、コールバックをリッスンする必要があるコードが破棄されているため、コールバックが戻ってきたときに誰もリッスンしていないということです。

于 2011-08-16T12:06:46.697 に答える