按WPF顺序运行的异步函数



所以我正在制作一个小的WPF应用程序。

我是C#和多线程的新手,我想按顺序运行某些方法,但因为其中一个方法是Async,所以它不按顺序运行。

private async void LoadButton_Click(object sender, RoutedEventArgs e)
{
if (!OpenFile()) return; // opens a file dialog and ensure format is correct

await Task.Run(() =>
{
// some heavy task which I run here so that I dont freeze the UI
});

}
private void TheFunctionIwantToRunInSeqeuence(object sender, RoutedEventArgs e)
{
LoadButton_Click(sender, e); 
SaveCareerInfoButton_Click(sender, e); // I want this line to wait for load to finish
LoadButton_Click(sender, e); 
ImportCareerInfoButton_Click(sender, e); // I want this line to wait for the second load to finish

}

等待这些调用,稍微重构一下代码。。将处理程序的内容提取到一个单独的方法,并且不在处理程序之间传递发送方和args

private Task Load()
{
if (!OpenFile()) return;
return Task.Run(() =>
{
// some heavy task which I run here so that I dont freeze the UI
});
}
private async void LoadButton_Click(object sender, RoutedEventArgs e)
{
await Load();
}
private async void TheFunctionIwantToRunInSeqeuence(object sender, RoutedEventArgs e)
{
await Load();
// refactor your code to not pass sender, e.. SaveCareer();
SaveCareerInfoButton_Click(sender, e);
await Load();
// refactor your code to not pass sender, e.. ImportCareer();
ImportCareerInfoButton_Click(sender, e);
}

您可以使用await等待异步函数完成,并使函数TheFunctionIwantToRunInSeqeuenceasync Task返回类型:

private async Task TheFunctionIwantToRunInSeqeuence(object sender, RoutedEventArgs e)
{
await LoadButton_Click(sender, e); 
SaveCareerInfoButton_Click(sender, e); // I want this line to wait for load to finish
await LoadButton_Click(sender, e); 
ImportCareerInfoButton_Click(sender, e); // I want this line to wait for the second load to finish

}

最新更新