2016-04-20 47 views

回答

1

是的,它們是相同的線程。你會想要產生一個新的線程來處理主要的處理。

下面的示例只是一個按鈕,它會睡眠(10秒鐘)主線程,一旦Button_Click被調用並且「睡眠」開始,整個UI變得無響應。

希望有所幫助。

的.xaml

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Button Content="Button" HorizontalAlignment="Left" Margin="231,142,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 

</Grid> 

的.cs

using System.Threading; 
using System.Windows; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      Thread.Sleep(10000); 
     } 
    } 
} 

編輯包括語法校正和採樣/示例代碼的解釋。

1

我們稱之爲Application.Run(或者你啓動WPF的任何機制)的線程是UI線程。通常,這是您的應用程序啓動的線程。

如果你想在不阻塞UI線程的情況下進行大量處理,你應該在新線程中完成。這裏有一個例子:

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    await Task.Run(() => Thread.Sleep(1000)); //Assume Thread.Sleep is your heavy processing 
} 
1

這取決於你在主線程中的意思。如果你的意思是運行Main()的線程,那麼這是可能的。你只需要產生它,使它成爲STA,並撥打Application.Run(),就像你在Main()中做的那樣。

此外,WPF可以有多個UI線程,因此有多個調度器。每個UI線程都可以訪問僅從當前線程創建的元素(以及當前線程的分派器)。

如果您想避免阻塞UI線程,那麼情況並非如此,請考慮使用async\await來代替。

+0

所以每個UI都有自己獨特的線程?或全部共享應用程序啓動主線程? – MonsterMMORPG