【发布时间】:2013-10-22 06:59:41
【问题描述】:
我有一个应用程序,当用户为列表框选择一个项目时,它会执行一项耗时的任务。
当用户选择一个节目时,应用程序将从 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,我确定问题出在我做事的方式而不是图书馆。
【问题讨论】:
-
您不能为每个请求创建新的
TvdbHandler吗?