C#WPF应用程序中的主线程和UI线程是否相同?

时间:2016-04-20 22:14:19

标签: c# .net wpf

你可以从另一个线程而不是主线程启动UI吗?那么主线程中的繁重处理不会阻止UI是可能的吗?

C#4.5 WPF应用程序

3 个答案:

答案 0 :(得分:2)

是的,他们是同一个主题。您可能希望生成一个新线程来处理主要处理。

以下示例只有一个按钮,一旦调用Button_Click并且"睡眠"该按钮将睡眠(持续10秒)主线程。开始整个用户界面变得没有反应。

希望有所帮助。

的.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 :(得分: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
}

答案 2 :(得分:1)

这取决于主线程的含义。如果你的意思是运行Main()的线程,那么它是可能的。您只需要生成它,将其设为STA并像Application.Run()中那样调用Main()

此外,WPF可以有多个UI线程,因此具有多个调度程序。每个UI线程只能访问从当前线程创建的元素(以及当前线程的调度程序)。

如果您想避免阻止UI线程,那么情况并非如此,请考虑改为使用async\await