Эквивалент InvokeRequired в WPF

#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;
    }
}