ユーザーがリストボックスのアイテムを選択するときに、時間のかかるタスクを実行するアプリケーションがあります。
ユーザーが番組を選択すると、アプリケーションはすべての番組情報を 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です。問題はライブラリではなく、私がどのようにやっているかにあると確信しています。