一文看懂系列--Async await 与UI主线程关系

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.释义:

  1. await 和线程调度

    • 当你使用 await 等待一个异步操作(比如 Manage_Axis.Instance.System8AxisMoveByRecipe)时,await 会暂停当前方法的执行,直到该异步操作完成。
    • 如果 System8AxisMoveByRecipe 是一个异步方法,await 会将控制权交给线程池中的其他线程(即后台线程),不会阻塞 UI 线程。
    • 这意味着,System8AxisMoveByRecipe 执行时,操作会在主线程之外的线程上进行(后台线程)。
  2. 返回到主线程

    • 在 System8AxisMoveByRecipe 执行完成后,await 会将剩下的代码(例如更新 UI 的代码)安排回 UI 线程执行。这是因为 UI 控件只能在 UI 线程上更新。
    • 所以,虽然 System8AxisMoveByRecipe 是在后台线程执行的,后续的 UI 更新操作会被调度回 UI 线程(如果有 UI 更新代码的话)。

3.补充

  • await 本身不会让方法变成多线程操作它只是在等待操作完成时(此时把操作给后台其他线程去做,其他后台线程做完那后,UI线程再去执行之后的任务)不阻塞主线程。如果 System8AxisMoveByRecipe 是异步且执行了后台操作,那么在这段时间内,UI 线程是自由的,可以继续响应用户输入等。
  • 如果 System8AxisMoveByRecipe 是同步方法,那么它会在主线程上执行,并可能会导致 UI 卡顿,直到执行完毕。
  • 所以,await 后的代码会在后台线程(如果方法是异步的)执行,而 UI 更新代码会回到主线程继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值