Używam MVVM Light do zbudowania aplikacji WP7 (Windows Phone 7). Chciałbym, aby cała praca wykonywana przez Model była uruchamiana w wątku tła. Następnie, gdy praca zostanie zakończona, podnieś wydarzenie, aby ViewModel mógł przetworzyć dane.Jak uruchomić funkcję w wątku tła dla Windows Phone 7?
Dowiedziałem się już, że nie mogę się odwoływać do Asystenta asynchronicznie z aplikacji WP7.
Obecnie próbuję użyć ThreadPool.QueueUserWorkItem(), aby uruchomić kod na wątku tła i użyć MVVM Light's DispatcherHelper.CheckBeginInvodeOnUI(), aby podnieść zdarzenie w wątku interfejsu użytkownika, aby zasygnalizować ViewModel, że dane zostały załadowane (to powoduje awarię VS2010 i Blend 4 przy próbie wyświetlenia widoku czasu projektu).
Czy istnieje przykładowy kod do uruchomienia kodu w wątku tła, a następnie wywołania zdarzenia z powrotem do wątku interfejsu użytkownika dla aplikacji WP7?
Z góry dziękuję, Jeff.
Edit - Oto przykład model
public class DataModel
{
public event EventHandler<DataLoadingEventArgs> DataLoadingComplete;
public event EventHandler<DataLoadingErrorEventArgs> DataLoadingError;
List<Data> _dataCasch = new List<Data>();
public void GetData()
{
ThreadPool.QueueUserWorkItem(func =>
{
try
{
LoadData();
if (DataLoadingComplete != null)
{
//Dispatch complete event back to the UI thread
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
//raise event
DataLoadingComplete(this, new DataLoadingEventArgs(_dataCasch));
});
}
}
catch (Exception ex)
{
if (DataLoadingError != null)
{
//Dispatch error event back to the UI thread
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
//raise error
DataLoadingError(this, new DataLoadingErrorEventArgs(ex));
});
}
}
});
}
private void LoadData()
{
//Do work to load data....
}
}
Nie zapomnij po prostu dokładnie sprawdzić wpływ na wydajność użycia nieokreślonych pasków postępu: http://www.jeff.wilcox.name/2010/08/progressbarperftips2/ –
zdecydowanie ustaw IsDeterminte = Fałsz, gdy nie są widoczne. – Micah
Źródło SafeDispatch byłoby miłe. – Sam