Ho il seguente compito che viene eseguito quando l'elemento di sezione di una casella di riepilogo cambia.Annullamento di tutte le attività quando viene creato uno nuovo
Sto tentando di annullare qualsiasi attività in esecuzione quando un utente modifica la selezione e avvia una nuova attività. Posso sembrare capire perché il codice non funziona.
Il codice
CancellationTokenSource cts;
// The event handeler for when the user makes a selection in the list box
private async void lb1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
clearfileds();
if (cts != null)
{ cts.Cancel(); }
cts = new CancellationTokenSource();
var token = cts.Token;
string sid = lb1.SelectedItem.ToString();
try
{
var series = await LoadSeriesAsync(token, Int32.Parse(sid));
var poster = await LoadPosterAsync(series.PosterBanners[0]);
UpdateSeries(series);
if (File.Exists(poster))
{
ImageSource imageSource = new BitmapImage(new Uri(poster));
imgPoster.Source = imageSource;
}
}
catch (OperationCanceledException)
{MessageBox.Show("we cancell some thing");}
catch (FormatException)
{MessageBox.Show("Please enter a valid series id");}
}
private async Task<TvdbSeries> LoadSeriesAsync(CancellationToken ct, int _seriesId)
{ TvdbSeries seriesloaded = null;
CancellationToken token = ct;
Task<TvdbSeries> SeriesLoadTask = Task.Run(() =>
{
m_tvdbHandler = new TvdbHandler(CacheProvider, "49E28C3EB13EB1CF");
m_tvdbHandler.InitCache();
token.ThrowIfCancellationRequested();
try
{ seriesloaded = m_tvdbHandler.GetSeries(_seriesId, TvdbLanguage.DefaultLanguage, true, true, true, true);
//Just for the test
System.Threading.Thread.Sleep(9000);
}
catch (OperationCanceledException)
{ }
catch (TvdbInvalidApiKeyException ex)
{ MessageBox.Show(ex.Message);}
catch (TvdbNotAvailableException ex)
{ MessageBox.Show(ex.Message);}
return seriesloaded;
});
try
{ seriesloaded = await SeriesLoadTask; }
catch (OperationCanceledException)
{}
return seriesloaded;
}
private async Task<string> LoadPosterAsync(object _param)
{
string posterpath ;
Task<string> PosterLoad = Task.Run(() =>
{
TvdbPosterBanner banner = (TvdbPosterBanner)_param;
banner.LoadBanner();
posterpath = CacheFolder + @"\" + banner.SeriesId + @"\img_posters_" + (banner.BannerPath).Replace(@"posters/", "");
return posterpath;
});
try
{ posterpath = await PosterLoad; }
catch (OperationCanceledException)
{
posterpath = "";
}
return posterpath;
}
Così sto cercando di ottenere LoadSeriesAsync di annullare tutti gli altri eventi che sono in esecuzione e quindi eseguire solo LoadPosterAsync se LoadSeriesAsync è permesso di finire (l'utente non cambia selezione prima che venga caricato).
Puoi essere più specifico su "non funziona"? – stuartd
Spiacente, l'attività non viene annullata – justinf
È necessario controllare manualmente 'token.IsCancellationRequested' in LoadSeriesAsync - vedere http://stackoverflow.com/a/3713113/43846 – stuartd