2011-10-14 29 views

Trả lời

5

này là hơi kỳ lạ vì nó không xuất hiện trong IntelliSense, nhưng bạn có thể sử dụng:

var dispatcher = myDispatcherObject.Dispatcher; 
if (dispatcher.CheckAccess()) { /* ... */ } 

Như tất cả các thành phần giao diện người dùng kế thừa từ DispatcherObject điều này sẽ giải quyết vấn đề cụ thể của bạn, nhưng nó không phải là cụ thể cho các chủ đề giao diện người dùng - nó có thể được sử dụng cho bất kỳ điều phối viên.

3

Một giải pháp khả thi mà đến tâm trí là:

if (Dispatcher.Thread.Equals(Thread.CurrentThread)) 
{ 
    Action(); 
} 
else 
{ 
    Dispatcher.Invoke(Action); 
} 
0

Nếu bạn đang xây dựng một ứng dụng Windows Store, ví dụ trên sẽ không hoạt động. Dưới đây là ví dụ rằng hiện hoạt động. Sửa đổi khi cần thiết, tất nhiên :)

/// <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; 
    } 
} 
Các vấn đề liên quan