最佳答案
我有一个 WPF 图形用户界面,我想按下一个按钮,开始一个长期的任务,而不冻结窗口的任务期间。当任务正在运行时,我想得到进度报告,并且我想合并另一个按钮,它将在我选择的任何时候停止任务。
我无法找到使用异步/等待/任务的正确方法。我不能把我试过的所有东西都包括进去,但这是我现在拥有的。
WPF 窗口类:
public partial class MainWindow : Window
{
readonly otherClass _burnBabyBurn = new OtherClass();
internal bool StopWorking = false;
//A button method to start the long running method
private async void Button_Click_3(object sender, RoutedEventArgs e)
{
Task slowBurn = _burnBabyBurn.ExecuteLongProcedureAsync(this, intParam1, intParam2, intParam3);
await slowBurn;
}
//A button Method to interrupt and stop the long running method
private void StopButton_Click(object sender, RoutedEventArgs e)
{
StopWorking = true;
}
//A method to allow the worker method to call back and update the gui
internal void UpdateWindow(string message)
{
TextBox1.Text = message;
}
}
以及 worker 方法的类:
class OtherClass
{
internal Task ExecuteLongProcedureAsync(MainWindow gui, int param1, int param2, int param3)
{
var tcs = new TaskCompletionSource<int>();
//Start doing work
gui.UpdateWindow("Work Started");
While(stillWorking)
{
//Mid procedure progress report
gui.UpdateWindow("Bath water n% thrown out");
if (gui.StopTraining) return tcs.Task;
}
//Exit message
gui.UpdateWindow("Done and Done");
return tcs.Task;
}
}
这将运行,但是一旦 worker 方法启动,WPF 函数窗口仍然被阻塞。
我需要知道如何安排允许的异步/等待/任务声明
不阻塞归属窗口的 worker 方法
B)让 worker 方法更新 gui 窗口
C)允许 GUI 窗口停止中断并停止 worker 方法
非常感谢您的帮助和指点。