#c# #wpf #multithreading
#c# #wpf #многопоточность
Вопрос:
Существует ли эквивалент Form.InvokeRequired в WPF, например, Dispatcher .Требуется InvokeRequired?
Ответ №1:
Это немного странно, поскольку оно не отображается в intellisense, но вы можете использовать:
var dispatcher = myDispatcherObject.Dispatcher;
if (dispatcher.CheckAccess()) { /* ... */ }
Поскольку все компоненты пользовательского интерфейса наследуются от DispatcherObject
этого, это должно решить вашу конкретную проблему, но это не относится к потоку пользовательского интерфейса — его можно использовать для любого диспетчера.
Ответ №2:
Эквивалентом является диспетчер.Проверьте доступ.
Ответ №3:
Возможное решение, которое пришло на ум:
if ( Dispatcher.Thread.Equals( Thread.CurrentThread ) )
{
Action( );
}
else
{
Dispatcher.Invoke( Action );
}
Ответ №4:
Если вы создаете приложение для магазина Windows, приведенный выше пример не будет работать. Вот пример, который действительно работает. Конечно, изменяйте по мере необходимости 🙂
/// <summary>
/// Updates the UI after the albums have been retrieved. This prevents the annoying delay when receiving the albums list.
/// </summary>
/// <param name="albums"></param>
public void UpdateUiAfterAlbumsRetrieved(System.Collections.ObjectModel.ObservableCollection<PhotoAlbum> albums)
{
if (!Dispatcher.HasThreadAccess)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
ddlAlbums.DataContext = albums;
ddlAlbums.IsEnabled = true;
tbxProgress.Text = String.Empty;
ProgressBar.IsIndeterminate = false;
ProgressBar.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
});
}
else
{
ddlAlbums.DataContext = albums;
ddlAlbums.IsEnabled = true;
tbxProgress.Text = String.Empty;
ProgressBar.IsIndeterminate = false;
}
}