【发布时间】:2020-02-23 22:54:03
【问题描述】:
我有一个按钮单击事件,它在其中执行一项很长的任务(可能从 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();
}
}
每当触发事件时,用户界面都不会更新,直到任务完成。即使我在事件触发后立即调用的 UI 更新也不会在任务完成之前发生。我该怎么办?
更新:这对我有用
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));
}
});
}
【问题讨论】:
标签: c# xamarin.forms task