执行按钮单击时,使wpf UI响应

San*_*tha 5 c# wpf multithreading background-process

在我的wpf(c#)应用程序中,当用户按下按钮时,会执行一个很长的过程.按下按钮直到执行完整代码,窗口冻结,用户无法在窗口中执行任何其他任务.如何使按钮单击代码作为后台进程,以便窗口响应用户.我尝试了以下方法,但没有成功.

private void btn_convert_Click(object sender, RoutedEventArgs e)
{
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, 
    new Action(() => { 

         WorkerMethod();
    }));
}
Run Code Online (Sandbox Code Playgroud)

WorkerMethod是整个代码的函数.任何建议.

此致,
Sangeetha

小智 10

如果您的目标是.NET 4.5,则可以使用async/await以使您的UI响应:

private async void btn_convert_Click(object sender, RoutedEventArgs e)
{
    await WorkerMethod();
}
Run Code Online (Sandbox Code Playgroud)

修改你的WorkerMethod:

private Task WorkerMethod()
{
    return Task.Run(() =>
        {
           // your long running task here
        });
}
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下这段代码吗?async和await关键字有什么作用? (2认同)

Aks*_*elK 7

这里答案的替代方案是BackgroundWorker.它还有一个好处,就是在完成后返回GUI线程.

private void btn_convert_Click(object sender, RoutedEventArgs e)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += WorkerMethod;
    worker.RunWorkerCompleted += WorkerEnded;
    worker.RunWorkerAsync();
}

private void WorkerMethod()
{
    // New thread, cannot access GUI
}

private void WorkerEnded()
{
    // Back on the GUI Thread
    // Worker is finished
}
Run Code Online (Sandbox Code Playgroud)


mak*_*akc 6

你在这里实际做的是要求UI线程通过Dispatcher运行繁重的任务.

您应该创建一个新线程/任务并让它运行您的后台方法:

Thread t = new Thread(() => WorkerMethod());
t.Start();
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请阅读:

WPF BackgroundWorker与Dispatcher

了解WPF中的"Dispatcher"