【问题标题】:WPF show indefinite progress while lengthy operation runsWPF 在运行冗长的操作时显示不确定的进度
【发布时间】:2019-03-04 17:33:37
【问题描述】:

我想在我编写的 BackgroundOperationWindow 类的小 WPF 窗口中显示一个不确定的进度条。这是一个带有无限进度条的简单窗口,但没有“取消”按钮,因为没有什么可以取消的。

它包含这个方法:

public async Task PerformAction( Action action )
{
    await Task.Run( () => action() );
}

用于显示与服务器的连接正在进行中:

async void ConnectToServer( object sender, RoutedEventArgs e )
{
    var bo = new BackgroundOperationWindow();
    bo.Show();
    await bo.PerformAction( () =>
    {
        // This takes some time...
        Server.Connect(...)
    } );
}

我的问题是:“ConnectToServer”在连接建立之前不会返回。 (由于此时ConnectToServer的调用窗口还不可见,所以被屏蔽是没有问题的)。 我发现的所有使用 async/await 的示例都使用某种“Button_Click”场景,其中Button_Click 在任务完成之前返回是可以的(并且是有意的)。

换句话说:我想去掉async void ConnectToServer(...)中的“async”。从调用者的角度来看,ConnectToServer 不应异步执行。

我正在寻找某种“Task.WaitAndKeepTheUIThreadRunningSoThatTheProgressBarAnimates()

【问题讨论】:

  • 显示阻塞模式窗口只是为了等待异步操作的结束对用户不太友好。但是,如果重构不是一种选择,我相信我可以解决您的问题:stackoverflow.com/a/53510363/1768303

标签: c# .net wpf


【解决方案1】:

将对 PerformAction 的调用放在它自己的任务中:

Task.Run(async () => await bo.Performan
    ...etc.

【讨论】:

  • 这并不能解决 OP 问题(他似乎想同步运行一个异步操作),但可能会引入一系列与 fire-and-forger 相关的其他问题。
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多