2016-04-20 44 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