1.代码示例
private async void bt_SytemLightTest(object sender, RoutedEventArgs e)
{
// 这行代码会调用异步方法,并且在后台线程执行,主线程不受阻塞
await Manage_Axis.Instance.System8AxisMoveByRecipe(
EnumSystemRecipeLightType.左1200红外光源,
Manage_File.BDRecipeTemp.LULightMotorPara.Channel,
Manage_File.BDRecipeTemp.LULightMotorPara.Brightness,
Manage_File.BDRecipeTemp.LULightMotorPara.FilterNum);
// 这行代码将在UI线程执行(即主线程)
myLabel.Content = "任务完成";
}
2.释义:
-
await和线程调度:- 当你使用
await等待一个异步操作(比如Manage_Axis.Instance.System8AxisMoveByRecipe)时,await会暂停当前方法的执行,直到该异步操作完成。 - 如果
System8AxisMoveByRecipe是一个异步方法,await会将控制权交给线程池中的其他线程(即后台线程),不会阻塞 UI 线程。 - 这意味着,
System8AxisMoveByRecipe执行时,操作会在主线程之外的线程上进行(后台线程)。
- 当你使用
-
返回到主线程:
- 在
System8AxisMoveByRecipe执行完成后,await会将剩下的代码(例如更新 UI 的代码)安排回 UI 线程执行。这是因为 UI 控件只能在 UI 线程上更新。 - 所以,虽然
System8AxisMoveByRecipe是在后台线程执行的,后续的 UI 更新操作会被调度回 UI 线程(如果有 UI 更新代码的话)。
- 在
3.补充
await本身不会让方法变成多线程操作。它只是在等待操作完成时(此时把操作给后台其他线程去做,其他后台线程做完那后,UI线程再去执行之后的任务)不阻塞主线程。如果System8AxisMoveByRecipe是异步且执行了后台操作,那么在这段时间内,UI 线程是自由的,可以继续响应用户输入等。- 如果
System8AxisMoveByRecipe是同步方法,那么它会在主线程上执行,并可能会导致 UI 卡顿,直到执行完毕。 -
所以,
await后的代码会在后台线程(如果方法是异步的)执行,而 UI 更新代码会回到主线程继续执行。
188

被折叠的 条评论
为什么被折叠?



