在同步编程中(在async/await
到达现场之前),我很清楚如何或为何发生跨线程异常。如果我启动了一个后台线程来完成一些繁重的任务,以便卸载UI线程并使其响应,我知道如何从后台线程访问UI线程。如果有疑问,我甚至可以检查给定代码执行的线程。
使用异步/等待异步编程,我发现什么是明确的线程识别模糊和模糊(甚至很好地证明了调试堆栈根据众多期待的任务跳转到整个地方)。
我试图找到的是一种路线图,它可以帮助我识别沿着颠簸的异步/等待蜿蜒的跨线程危险区域/陷阱(原谅隐喻)。
在异步编程方面,我究竟应该注意什么来避免跨线程异常?这些可以制成某种清单吗?
答案 0 :(得分:6)
我介绍了async
intro中的主要线程注意事项。具体而言,await
的默认行为是捕获“上下文”,然后在该“上下文”中恢复该方法。对于UI线程,该上下文将导致async
方法在UI线程上恢复。
因此,简单async
和await
完全避免了大多数跨线程问题。
请注意,如果您确实介绍了后台线程(例如Task.Run
),那么当然这些后台线程可能会导致跨线程异常,您必须适当地避免这些。