【发布时间】: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