0

ユーザーがリストボックスのアイテムを選択するときに、時間のかかるタスクを実行するアプリケーションがあります。

ユーザーが番組を選択すると、アプリケーションはすべての番組情報を tvdb から取得し、Ui に表示します。

この問題は、番組の読み込み中にユーザーが選択をすばやく変更した場合に発生します。

ユーザーが考えを変えて、最初の読み込み中に別の選択を行い、その情報を Ui に表示できるようにしたいと思います。

問題を示すために簡単なデモ アプリケーションを作成しました: Demo App

これは私がやろうとしたことです

リスト ボックス選択イベント ハンドラ

private  void lb1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string sid = lb1.SelectedItem.ToString();

            try
            {
                LoadSeries(Int32.Parse(sid));
            }
            catch (FormatException)
            {
                MessageBox.Show("Please enter a valid series id");
            }
        }

ロードシリーズ

private void LoadSeries(int _seriesId)
{

    Task<TvdbSeries> series = Task.Factory.StartNew(() =>
    {
        TvdbSeries seriesloaded = null;
        try
        {
            seriesloaded = m_tvdbHandler.GetSeries(_seriesId, TvdbLanguage.DefaultLanguage, true, true, true, true);
        }
        catch (TvdbInvalidApiKeyException ex)
        {
            MessageBox.Show(ex.Message);
        }
        catch (TvdbNotAvailableException ex)
        {
            MessageBox.Show(ex.Message);
        }

        return seriesloaded;
    }
     );

    series.ContinueWith((antecedent) =>
    {
        UpdateSeries(series.Result);
    },
        TaskScheduler.FromCurrentSynchronizationContext()
    );

}

ユーザーが選択をすばやく変更すると、アプリケーション エラーが発生しseriesloaded = m_tvdbHandler.GetSeries(_seriesId, TvdbLanguage.DefaultLanguage, true, true, true, true);、デバッガーに「WebClient は同時 I/O 操作をサポートしていません。」というメッセージが表示されます。

最後のリクエストが完了する前に新しいリクエストを作成しているためであることがわかりましたが、 m_tvdbHandler.GetSeries でコードをチェーンする方法がありません.

これはライブラリtvdblibです。問題はライブラリではなく、私がどのようにやっているかにあると確信しています。

4

2 に答える 2

1

ユーザーが選択を行うと、情報が完全に読み込まれるまで UI を無効にし、一番下の読み込み中にメッセージを表示してお待ちください。すべてが読み込まれたら、Ui を有効にしてメッセージを非表示にします。

于 2013-10-20T14:15:15.983 に答える