2015-05-01 54 views
4

我有一類依賴項屬性,我們稱之爲「SomethingControl」:將PropertyChangedCallback標記爲異步是否安全?

public static readonly DependencyProperty SomethingProperty = DependencyProperty.Register("Something", typeof(Something), typeof(SomethingControl), new UIPropertyMetadata(SomethingGotSet)); 

而且我已經定義正在被傳遞到UIPropertyMetadata構造爲異步回調方法:

private async static void SomethingGotSet(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var control = (SomethingControl)d; 
     if (control != null) 
     { 
      control.SomeOtherProperty = await AsynchronousMethodCall(); 
     } 
    } 

這是安全的嗎?這是否會導致UI線程上的死鎖或問題?我測試過了,它似乎工作正常,但我找不到使用異步屬性回調方法的MSDN文檔中的任何內容。

回答

5

從您向我們展示的內容看,這看起來非常安全。

PropertyChangedCallback什麼也沒有返回(void)。該框架將以「Fire-and-Forget」方式調用此方法。

因此,調用可能會導致稍後回發到用戶界面線程的事實很好,並且不會直接影響此更改通知流。

如果存在多個線程,並且一個線程正在等待另一個線程持有的資源發生死鎖,反之亦然。根據AsynchronousCall的作用,系統中某處可能仍然存在死鎖,但這不會因爲您的實施而導致死鎖。