2014-11-20 27 views
1

這裏是我的擴展方法:的WPF控件的extenstion方法引起StackOverflowException

public static void SetThreadSafeProperty<T>(this System.Windows.FrameworkElement control, Expression<Func<T>> property, T value) 
{ 
    if (control.Dispatcher.CheckAccess()) 
    { 
     var del = new SetThreadSafePropertyDelegate<T>(SetThreadSafeProperty); 
     control.Dispatcher.Invoke(del, control, property, value); 
    } 
    else 
    { 
     PropertyInfo propertyInfo = GetPropertyInfo(property); 
     if (propertyInfo != null) 
     { 
      propertyInfo.SetValue(control, value, null); 
     } 
    } 
} 

而這裏的如何,我叫它:

tbManufacturer.SetThreadSafeProperty(() => tbManufacturer.Text, "test"); 

調試它之後,它看起來像它陷入無限循環。 CheckAcess()是真的,它創建的deletegate只是罰款和調用正確。但它不斷前進並最終失敗。

關於這可能發生的原因的任何想法?

+0

與調試器斷點運行它,看看問題變得明顯。 – 2014-11-20 19:36:52

+3

它應該是相反的:'if(!control.Dispatcher.CheckAccess())' – Clemens 2014-11-20 19:37:24

+0

@Clemens就是這樣,謝謝! – ernest 2014-11-20 19:42:07

回答

6

你的條件錯了 - CheckAccess()將返回true當它是好吧修改當前線程中的對象。

當前,您說「如果我已經在UI線程中,請在UI線程中再次調用該方法」 - 這顯然會導致問題。你想說「如果我不 UI線程,在UI線程再次調用方法」 - 讓你的代碼應該是:

if (!control.Dispatcher.CheckAccess()) 
+1

啊,是的。我將WinForm庫轉換爲WPF和InvokeRequired屬性具有相反的效果。有用。謝謝! – ernest 2014-11-20 19:41:07

相關問題