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)
这里答案的替代方案是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)
你在这里实际做的是要求UI线程通过Dispatcher运行繁重的任务.
您应该创建一个新线程/任务并让它运行您的后台方法:
Thread t = new Thread(() => WorkerMethod());
t.Start();
Run Code Online (Sandbox Code Playgroud)
欲了解更多信息,请阅读:
WPF BackgroundWorker与Dispatcher
| 归档时间: |
|
| 查看次数: |
12243 次 |
| 最近记录: |