У меня есть графический интерфейс WPF, где я хочу нажать кнопку, чтобы начать длинную задачу, не замораживая окно на время выполнения задачи. Во время выполнения задачи я хотел бы получить отчеты о прогрессе, и я хотел бы включить еще одну кнопку, которая остановит задачу в любое время, когда я выберу.
Я не могу определить правильный способ использования async/wait/task. Я не могу включить все, что я пробовал, но это то, что у меня есть на данный момент.
Класс окна 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 burnTheBaby = _burnBabyBurn.ExecuteLongProcedureAsync(this, intParam1, intParam2, intParam3);
await burnTheBaby;
}
//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;
}
}
И класс для рабочего метода:
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;
}
}
Это выполняется, но окно функции WPF по-прежнему блокируется после запуска рабочего метода.
Мне нужно знать, как упорядочить объявления async/await/task, чтобы разрешить
A) рабочий метод не блокирует окно gui
B) пусть рабочий метод обновит окно gui
C) разрешить окну gui прекратить прерывание и остановить рабочий метод
Любая помощь или указатели очень оценены.