C# 按钮单击事件,任务未更新ui
我有一个按钮点击事件,它在其中执行一个长任务(可以从3分钟到3分钟不等) 每当触发事件时,直到任务完成,ui才会更新。即使是我在事件触发后立即调用的UI更新,在任务完成之前也不会发生。我该怎么办 更新:这就是我的工作C# 按钮单击事件,任务未更新ui,c#,xamarin.forms,task,C#,Xamarin.forms,Task,我有一个按钮点击事件,它在其中执行一个长任务(可以从3分钟到3分钟不等) 每当触发事件时,直到任务完成,ui才会更新。即使是我在事件触发后立即调用的UI更新,在任务完成之前也不会发生。我该怎么办 更新:这就是我的工作 private async void B_Clicked(object sender, EventArgs e) { await PreBumpWork(); Device.BeginInvokeOnM
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));
}
});
}
这将迫使代码在主线程上执行它。
同时删除
.Wait()代码>正如Peter所说,它将导致死锁。您可以尝试在不同的线程中运行代码,并在线程方法中使用委托(操作)-添加\删除对线程方法的其他调用来更新UI。
例如:
谢谢,这一点,再加上San的答案中的任务,对我来说很有效。我将用有效的代码更新它
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));
}
});
}
Device.BeginInvokeOnMainThread (() => {
//put your UI updates here
});
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;
object val = new string[] { grade, loadPop };
Thread thread = new Thread(MyMethod);
thread.Start(val);
}
}
private void MyMethod(object Data)
{
Invoke(new Action(() => UpdateApplicationUI(Data)));
}
private void UpdateApplicationUI(object Data)
{
object[] items = (object[])Data;
string grade = items[0] as string;
SfPopupLayout loadPop = items[1] as SfPopupLayout;
BumpGrade(grade);
UpdateOverallScore();
AssList.ItemsSource = Asses;
loadPop.Dismiss();
}