首页 > 解决方案 > WPF 在运行冗长的操作时显示不确定的进度

问题描述

我想在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. 从调用者的角度来看,不应异步执行。async void ConnectToServer(...)ConnectToServer

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

标签: c#.netwpf

解决方案


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

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

推荐阅读