У меня есть событие нажатия кнопки, которое выполняет длинную задачу внутри него (может варьироваться от 3 с до 3 минут)
private void B_Clicked(object sender, EventArgs e)
{
bumpPop.Dismiss();
SfPopupLayout loadPop = new SfPopupLayout();
DataTemplate loadView = new DataTemplate(() =>
{
SfBusyIndicator busy = new SfBusyIndicator();
return busy;
});
loadPop.PopupView.ContentTemplate = loadView;
loadPop.Show();
if (String.IsNullOrEmpty((string)gradeSel.SelectedValue) || String.IsNullOrWhiteSpace((string)gradeSel.SelectedValue))
{
gradeSel.Watermark = "Please select a grade";
loadPop.Dismiss();
bumpPop.Show();
}
else
{
string grade = (string) gradeSel.SelectedValue;
Task.Run(() => BumpGrade(grade)).Wait();
UpdateOverallScore();
AssList.ItemsSource = Asses;
loadPop.Dismiss();
}
}
Всякий раз, когда происходит событие, пользовательский интерфейс не обновляется, пока задача не выполнится законченный. Даже обновления пользовательского интерфейса, которые я вызываю сразу после события, не происходят, пока задача не будет завершена. Что мне делать?
ОБНОВЛЕНИЕ: Это то, что у меня сработало
private async void B_Clicked(object sender, EventArgs e)
{
await PreBumpWork();
Device.BeginInvokeOnMainThread(() => {
loadPop.Dismiss();
loadPop.IsOpen = false;
loadPop.IsVisible = false;
});
}
private Task PreBumpWork()
{
return Task.Factory.StartNew(() =>
{
Device.BeginInvokeOnMainThread(() =>
{
bumpPop.Dismiss();
DataTemplate loadView = new DataTemplate(() =>
{
SfBusyIndicator busy = new SfBusyIndicator();
busy.IsBusy = true;
return busy;
});
loadPop.PopupView.ContentTemplate = loadView;
loadPop.PopupView.ShowFooter = false;
loadPop.PopupView.ShowHeader = false;
loadPop.ClosePopupOnBackButtonPressed = false;
loadPop.Show();
});
if (String.IsNullOrEmpty((string)gradeSel.SelectedValue) || String.IsNullOrWhiteSpace((string)gradeSel.SelectedValue))
{
Device.BeginInvokeOnMainThread(() => {
gradeSel.Watermark = "Please select a grade";
loadPop.Dismiss();
bumpPop.Show();
});
}
else
{
string grade = (string)gradeSel.SelectedValue;
Task.Run(async () => await BumpGrade(grade));
}
});
}