Поскольку Pratyay упоминается в его комментарии, количество времени будет зависеть от устройства.
Но что касается ключевого слова await
, я считаю, что то, что вы испытываете, является предполагаемым поведением.
Оператор ожидания применяется к задаче в асинхронном методе, чтобы вставить точку приостановки при выполнении метода до завершения ожидаемой задачи. Задача представляет текущую работу.
Источник @ Microsoft Doc
Это означает, что ваша функция ShowInput
вернет свой объект Task<string>
, как только она достигнет ключевого слова await
. Затем после возврата dialog.ShowAsync();
он продолжит работу функции ShowInput
в асинхронном режиме и поместит результаты в объект Task для извлечения.
Так что, хотя ваша ShowInput
функция должна возвращаться почти сразу. Вы заметите задержку между dialog.ShowAsync();
и return textBox.Text;
.
Еще одна вещь, которую нужно иметь в виду, это то, что когда окно закрывается, обычно до завершения цикла окна обычно происходит небольшая обработка (удаление ресурсов и т. Д.). Как написан ваш код, вам придется подождать, пока все это не закончится, прежде чем вы получите свой результат.
Можно ли как-нибудь ускорить время между нажатием OK и ожиданием возврата?
Я полагаю, что самый быстрый способ получить ответ - не ждать ContentDialog, а скорее ждать сигнала, который появляется, когда контент доступен.
public static Task<string> ShowInput(string message, string defaultValue, string title)
{
var dialog = new ContentDialog { Title = title };
var panel = new StackPanel();
panel.Children.Add(new TextBlock { Text = message, TextWrapping = Windows.UI.Xaml.TextWrapping.Wrap });
var textBox = new TextBox() { Text = defaultValue };
textBox.SelectAll();
var signal = new TaskCompletionSource<string>();
textBox.KeyUp += (o, e) =>
{
if (e.Key == Windows.System.VirtualKey.Enter)
{
dialog.Hide();
signal.SetResult(textBox.Text);
}
e.Handled = true;
};
dialog.PrimaryButtonClick += (o, e) =>
{
dialog.Hide();
signal.SetResult(textBox.Text);
};
panel.Children.Add(textBox);
dialog.Content = panel;
dialog.PrimaryButtonText = "OK";
dialog.ShowAsync();
return signal.Task;
}
Редактировать: выполнение этого пути больше не требует дополнительного ожидания, поскольку создаваемая задача имеет конечный результат.