C# 当我的方法在后台WPF中执行某些操作时,如何打开窗口或其他什么

C# 当我的方法在后台WPF中执行某些操作时,如何打开窗口或其他什么,c#,wpf,user-interface,freeze,C#,Wpf,User Interface,Freeze,据我们所知, 程序正在逐行执行,现在我面临一个问题,我有一个方法需要几秒钟来执行, 我以为我可以通过线程解决它,但我将在稍后讨论,现在我想做的是下一步: 当该方法开始执行且该方法完成时,如何打开一个带有“仍在执行…”消息的窗口, 我需要它,因为我想避免UI冻结,因为长方法不在另一个任务/线程中 下面是它的样子: if (e.Key == Key.Delete) { //Could I show window here like like "Loading please wait.."

据我们所知, 程序正在逐行执行,现在我面临一个问题,我有一个方法需要几秒钟来执行, 我以为我可以通过线程解决它,但我将在稍后讨论,现在我想做的是下一步:

当该方法开始执行且该方法完成时,如何打开一个带有“仍在执行…”消息的窗口, 我需要它,因为我想避免UI冻结,因为长方法不在另一个任务/线程中

下面是它的样子:

if (e.Key == Key.Delete)
{
    //Could I show window here like like "Loading please wait.."
    ExecuteLongMethod();
    //When this is done close this method
}
谢谢各位,
Cheers

顶部窗口/控件显示进度信息,主窗口被禁用的示例:

if (e.Key == Key.Delete)
{
    // create a window with a progress ring or progress bar
    var window = new Window();

    new Thread(() =>
    {
        // execute long method
        ExecuteLongMethod();

        // close the progress window - release control
        // ensure it is done on the UI thread
        System.Windows.Application.Current.Dispatcher.Invoke(() => window.Close());
    }).Start();

    // display progress window
    window.ShowDialog();  
}

另一种方法是临时禁用或隐藏可能干扰后台线程的任何UI元素(按钮、选项卡),并且不阻止主窗口。

如果出于某种原因必须在调度程序线程上执行
ExecuteLongMethod()
,您可以创建一个在单独线程中启动的新窗口,并在长时间运行的方法完成所需的时间内显示该窗口。有关更多信息,请参阅以下链接

另一个选项是在后台线程上执行长时间运行的方法,并在主线程上显示加载窗口

建议使用任务并行库(TPL)并启动任务:

使用等待模式

    public void YourMethod()
    {


        if (e.Key == Key.Delete)
        {
            //Could I show window here like like "Loading please wait.."
            FireAndForget();
            //When this is done close this method
        }
    }

    public async void FireAndForget()
    {

        await Task.Run(() => { ExecuteLongMethod(); });

    }
开火和遗忘是一种反模式,所以,但有时你会遇到无法永远等待的问题,比如在
命令中

如果你想等待一个结果或者直到它结束,就这样做吧

public async void YourMethodAsync()
{


    if (e.Key == Key.Delete)
    {
        //Could I show window here like like "Loading please wait.."
        await CorrectWayAsync();
        //When this is done close this method
    }
}



public async Task CorrectWayAsync()
{
    await Task.Run(() => { ExecuteLongMethod(); });
}

“仍在执行…”的窗口如何避免UI冻结?@user3292642,因为在后台发生某些事情之前,他会一直显示在那里?System.Threading.CancellationToken.None,TaskContinuationOptions.None,TaskScheduler.FromCurrentSynchronizationContext()有什么作用;方法这是否可能停留在进程中的某个位置或服务器中,或者我的应用程序之外的某个位置?TaskScheduler.FromCurrentSynchronizationContext()确保在UI线程上执行ContinueWith委托(window.Close())。System.Threading.CancellationToken.None和TaskContinuationOptions。None是传递给ContinueWith方法的默认参数。这就是所谓的线程化吗?或我将阅读您现在提供的链接,您非常棒,谢谢mm8是的,Task.Factory.StartNew创建并启动一个任务,该任务最终将使用默认的TaskScheduler在线程池线程上执行。
public async void YourMethodAsync()
{


    if (e.Key == Key.Delete)
    {
        //Could I show window here like like "Loading please wait.."
        await CorrectWayAsync();
        //When this is done close this method
    }
}



public async Task CorrectWayAsync()
{
    await Task.Run(() => { ExecuteLongMethod(); });
}