即使使用多线程,UI仍然被锁定

本文关键字:锁定 多线程 UI | 更新日期: 2023-09-27 17:59:46

我正在做一个项目,UI遇到了很多障碍。在这种情况下,创建一个新线程来更新UI,使UI主线程保持打开状态,从而允许您仍然使用UI。

我不确定这是什么问题。我想也许我正在使用dispatcher创建线程,而不是创建使用主线程的线程??同样值得注意的是,我的MainWindow是单例实例。

private void button_Click(object sender, RoutedEventArgs e)
{    
    if (go)
    {
        city = textBox.GetLineText(0);
        if (city == "exit")
        {
            Environment.Exit(0);
        }
        Thread t1 = new Thread(new ThreadStart(
                    delegate
                    {
                       this.Dispatcher.Invoke(DispatcherPriority.Background, new Action(start));
                    }));
         t1.Start();
         //await Task.Run(() => start());
    }
}

即使使用多线程,UI仍然被锁定

您不需要创建新的线程。当您使用async和wait时,将自动从线程池中分配一个新线程。只需使button_Click事件处理程序异步即可,如下面代码中所述,并使用await关键字调用长时间运行的任务。

private async void button_Click(object sender, RoutedEventArgs e)
{
    if (go)
    {
        city = textBox.GetLineText(0);
        if (city == "exit")
        {
            Environment.Exit(0);
        }
        await Task.Run(() => start());
    }
}

这里会发生的事情是,当你点击按钮时,事件将被处理。如果满足条件,则在该行await Task.Run(() => start());中启动长时间运行的任务。然后它将返回到UI线程而不阻塞它,即当另一个线程在后台执行长时间运行的进程时,UI仍将响应。

请阅读MSDN上的异步编程和等待(C#)。

编辑:由于您希望在start()方法中控制UI元素,请使用以下方法:

private async void button_Click(object sender, RoutedEventArgs e)
{
    if (go)
    {
        city = textBox.GetLineText(0);
        if (city == "exit")
        {
            Environment.Exit(0);
        }
        await start();
    }
}
private async Task start()
{
    await Task.Run(async () => 
    {
       // long running task here
    });   
    // UI Control code here.
}