2010-05-24 65 views
2

我正在開發一個WPF Windows應用程序,並且遇到了運行.NET 3.0中的應用程序的麻煩。每次嘗試訪問System.Windows.Threading.Dispatcher.Invoke()方法時,都會收到方法未找到的錯誤。Dispatcher.Invoke在.NET 3.0 SP1中不起作用

基本上,我產卵從主線程一個新線程,使用下面的代碼來自新線程嘗試改變一些UI屬性(基本上更新進度條):

updateStatusDelegate usd = new updateStatusDelegate(progressBar.SetValue); 
Dispatcher.Invoke(usd, System.Windows.Threading.DispatcherPriority.Background, new object[] { System.Windows.Controls.ProgressBar.ValueProperty, Convert.ToDouble(perc) }); 

有人可以幫助我瞭解爲什麼我在.NET 3.0版本中遇到此錯誤?我能夠在.NET 3.0 SP2中實現這一目標。但我猜.NET不是獨立分發的,只是使用.NET 3.5版本打包。我的目標是擺脫.net 3.5的依賴,並對.NET 3.0的版本有所依賴

任何幫助,將不勝感激。

感謝

卡皮爾

回答

2

WPF類中存在相當多的流量。請注意此方法的MSDN Library article底部的「Supported in」註釋。您至少需要在該計算機上安裝.NET 3.0 SP1,這是與.NET 3.5同時發佈的服務包。

有沒有好的方法來檢查這個,[AssemblyVersion]沒有改變。這是通過依靠Windows Update自動升級.NET版本來實現的。如果您的客戶阻止了這些更新,那麼您將不得不安裝安裝了原始.NET 3.0版本的測試機器。

解決方法非常簡單,一旦找到它們,就可以使用3.0 RTM中提供的重載。要求客戶部署3.5 SP1是明智的。

+0

謝謝,我發現我使用的API不應該在.net 3.0上運行 – Kapil 2010-05-25 11:17:42

1

試試這個:

updateStatusDelegate usd = new updateStatusDelegate(progressBar.SetValue); 
Dispatcher.CurrentDispatcher.Invoke(
    usd, 
    DispatcherPriority.Background, 
    new object[] { ProgressBar.ValueProperty, Convert.ToDouble(perc) }); 

調用不是一個靜態方法。你必須在類的一個實例上調用它。您可以使用靜態屬性Dispatcher.CurrentDispatcher來獲取(或創建)與當前線程關聯的調度程序。

(順便說一句,你是不正確的,這將有不同版本的框架工作。)


我採取了以下程序(都在MainWindow.xaml.cs):

public partial class MainWindow : Window 
{ 
    private string perc = ".25"; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     updateStatusDelegate usd = new updateStatusDelegate(
      progressBar.SetValue); 
     Dispatcher.Invoke(usd, 
      System.Windows.Threading.DispatcherPriority.Background, 
      new object[] { 
       System.Windows.Controls.ProgressBar.ValueProperty, 
       Convert.ToDouble(perc) }); 

     var dbl = Convert.ToDouble(perc); 
     perc = (dbl + .1).ToString(); 
    } 
} 
public delegate void updateStatusDelegate(DependencyProperty dp, object value); 

並運行它的目標爲3.0,3.5(sp1)和4.0。它適用於每個版本。

這使我得出三個結論。首先,perc可能不是一個字符串,並且Convert.ToDouble沒有重載來轉換它的實際類型。其次,用戶的電腦被丟棄,需要清潔(擦拭,重新安裝)。第三,你的問題在別處,而你認爲這是你得到例外的地方,但實際上它在別的地方。

+0

意志,每DispatcherObject的(一個窗口是一個DispatcherObject的)的調度屬性,它使System.Windows.Threading.Dispatcher的實例)。它在我的代碼中引用的這個Dispatcher屬性。 對不起,在我的文章中沒有說清楚。但是,您的解決方案不會幫助我超越未發現的異常。 我已經測試了.net 3.0 sp2 env中的應用程序,它工作得很好 – Kapil 2010-05-24 12:44:17

+0

@Kapil會更新,但很難猜測,因爲您沒有提供任何有關找不到方法的信息。我正在嘗試複製(午餐晚餐)。 – Will 2010-05-24 17:59:15

+0

@Kapil究竟是'perc'的類型? – Will 2010-05-24 17:59:47