2010-08-05 40 views
0
var t = new Thread(new ParameterizedThreadStart(DoWork)); 
    t.SetApartmentState(ApartmentState.STA); 
    t.IsBackground = true; 
    t.Start(App.Current.MainWindow); 

    public static void DoWork(object owner) 
    { 
     var progressDlg = new ProgressBarDialog(); 

     // progressDlg.Owner = (Window)owner; // This doesn't work 

     progressDlg.ShowDialog(); 
    } 

現在,請告訴我是否有可能使其工作?如何從另一個線程訪問Window?

該示例中的App.Current.MainWindow不能從其他線程訪問。

而且我也聽說過Parallel.Invoke()的新酷方法,但我不知道是否適用於這種情況。我很感激你是否告訴我它是如何工作的。

+0

我只能假設ProgressBarDialog是某種形式的窗口,我想一個WPF窗口。您不能在一個線程中創建UI元素,並將所有者設置爲屬於不同線程的東西。 – 2010-08-05 20:45:18

回答

0

無法從後臺線程訪問UI,所有更新都必須位於主線程上。這包括設置依賴項屬性,就像你在上面的例子中試圖做的那樣。你可以通過使用Dispatcher來解決這個問題。

像這樣的事情

Action x = (Action)delegate { 
     //do my UI updating 
    }; 
    Dispatcher.Invoke(x, new object[] { }); 

這是相同的答案我給here...

+0

它不工作,因爲我無法從單獨的線程獲得對(窗口)所有者的任何訪問權限。但理論上這不是不可能的。應該有辦法在另一個線程中創建一個窗口,並從主線程獲取該窗口的所有者。 – Agzam 2010-08-06 19:11:36