C# 按钮单击事件,任务未更新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

我有一个按钮点击事件,它在其中执行一个长任务(可以从3分钟到3分钟不等)

每当触发事件时,直到任务完成,ui才会更新。即使是我在事件触发后立即调用的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));
                }
            });
        }

这将迫使代码在主线程上执行它。
同时删除
.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();
    }