你可以从另一个线程而不是主线程启动UI吗?那么主线程中的繁重处理不会阻止UI是可能的吗?
C#4.5 WPF应用程序
答案 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
。