Я хочу показать неопределенный индикатор выполнения в маленьком окне WPF класса BackgroundOperationWindow, которое я написал. Это простое окно с бесконечной полосой прогресса, но без кнопки «Отмена», так как отменять нечего.
Он содержит этот метод:
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()"





Поместите вызов PerformAction в собственную задачу:
Task.Run(async () => await bo.Performan
...etc.
Это не решает проблему OP (похоже, он хочет синхронно запустить асинхронную операцию), но потенциально может привести к множеству других проблем, связанных с фальшивомонетчик.
Не совсем удобно показывать блокирующее модальное окно только для того, чтобы дождаться окончания асинхронной операции. Однако, если рефакторинг невозможен, думаю, у меня есть решение вашей проблемы: stackoverflow.com/a/53510363/1768303