首页 > 解决方案 > 在 WPF 中登录时并行运行进度条“不确定”

问题描述

有人可以帮我解决以下问题吗?

我想在用户连接到 SSH 服务器时显示一个“Indeterminate = TRUE”的“进度条”。如果与服务器的连接成功,则应关闭带有进度条的 MainWindow,并打开一个新窗口。进度条放置在另一个名为“LoginState”的窗口上。

这是我如何尝试的一个小代码示例:

来自登录方法的代码:

private async void Login(object sender, RoutedEventArgs e)
{
  loginstate.Show();
  dispatcherlogin = Dispatcher.BeginInvoke(DispatcherPriority.Normal, new DelegateLogin(ProcessLogin));
  await dispatcherlogin.Task;
  
  if(ProofIfUserActive() == true)
  {
     loginstate.Close();
     mainoverview.Show();
     Close();
  }

private void ProcessLogin()
{
   // SSH and MySQL Connection
}

我的问题:

如果按下按钮,将触发 Methode“登录”。此时会出现进度条,并开始与 ssh 服务器的连接。问题是,我在打开进度条时看不到任何进度,并且在成功连接后,带有进度条的主窗口将被关闭,而另一个窗口将被打开。

我也尝试使用 Dsipatcher.Invoke 方法,但没有成功。这甚至可能是我想要的吗,因为我如何理解它,wpf 应用程序是在 UI“STA 线程”中运行的。多线程是不可能的,因为我立即得到了一个只允许 STA 线程的异常。

感谢开发人员的帮助;)

标签: c#wpfdispatchersta

解决方案


Dispatcher.BeginInvoke将要求 IU 线程进行登录。因此,在建立连接时,UI 线程被阻塞,无法更新任何窗口或执行与 UI 相关的任何其他操作。

为了解决这个问题,典型的解决方案是将耗时的操作移至后台线程。这可以通过使用来完成Task.Run。这将释放 UI 线程来更新 UI 并响应用户输入。

在后台线程上运行的一个典型问题是尝试更新 UI。这是不允许的,您需要将在后台运行的任何代码与 UI 代码完全分开。

可能某些组件(通常是 COM 组件)对线程有更复杂的规则,但我不希望 MySQL 或 SSH 有这样的要求。


推荐阅读