0

私はこのコードを持っていますが、これは非常に簡単に見えますが、AutoResetEventが通知されることはありません。Webサービスから何も返されないようで、WaitAllは10秒後にタイムアウトします。スレッドジゲリーポケリーがなくてもすべて正常に動作するため、Webサービスの問題ではありません。私は何が間違っているのですか?

    AutoResetEvent[] autoEvents;
    ObservableCollection<Tx3.ResourceService.ResourceTime> resourceTime;
    ObservableCollection<Tx3.ResourceService.ResourceTimeDetail> resourceTimeDetail;

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        autoEvents = new AutoResetEvent[]
        {
            new AutoResetEvent(false),
            new AutoResetEvent(false),
        };

        var resourceService = getResourceServiceClient();

        // Get ResourceTime data for this user
        resourceService.ListResourceTimeAsync(CategoryWorkItemId, ResourceId);
        resourceService.ListResourceTimeCompleted += new EventHandler<Tx3.ResourceService.ListResourceTimeCompletedEventArgs>(resourceService_ListResourceTimeCompleted);

        // Get ResourceTimeDetails
        resourceService.ListResourceTimeDetailAsync(CategoryWorkItemId, ResourceId);
        resourceService.ListResourceTimeDetailCompleted += new EventHandler<ListResourceTimeDetailCompletedEventArgs>(resourceService_ListResourceTimeDetailCompleted);

        WaitHandle.WaitAll(autoEvents, 10000);

        System.Diagnostics.Debug.WriteLine("do something with both datasets");
    }

    void resourceService_ListResourceTimeCompleted(object sender, Tx3.ResourceService.ListResourceTimeCompletedEventArgs e)
    {
        resourceTime = e.Result;
        autoEvents[0].Set();
    }

    void resourceService_ListResourceTimeDetailCompleted(object sender, ListResourceTimeDetailCompletedEventArgs e)
    {
        resourceTimeDetail = e.Result;
        autoEvents[1].Set();
    }
4

3 に答える 3

2

私は素朴な最初の推測を提供することができます:非同期操作を開始するメソッドを呼び出した後にイベントハンドラーを追加しているようです。そこに競合状態があるか、その他の問題がある可能性があります。イベントハンドラーをアタッチしてから操作を開始するように、操作の順序を切り替えてもらえますか?

于 2009-11-17T15:48:48.750 に答える
1

これらはAutoResetEventオブジェクトです-ManualResetEventが必要なようです-自動バージョンは待機中のものをトリガーしますが、すぐにリセットされます。手動のものはトリガーされたままなので、WaitAllに到達する前にコールバックが発生した場合、すぐに失敗します。

また、qidは正しいです-イベントハンドラーをアタッチするのが遅すぎます...したがって、ここでは2つの異なるバグが発生しています。

于 2009-11-17T15:51:24.683 に答える
1

メイン UI スレッドなど、STA 属性でマークされたスレッドでこのコードを使用していますか? その場合、WaitAll メソッドはこれらのスレッドではサポートされていません。

ここで確認してください。

于 2009-11-17T21:03:48.327 に答える