异步编程中的跨线程异常

时间:2015-11-27 00:07:18

标签: c# multithreading asynchronous

在同步编程中(在async/await到达现场之前),我很清楚如何或为何发生跨线程异常。如果我启动了一个后台线程来完成一些繁重的任务,以便卸载UI线程并使其响应,我知道如何从后台线程访问UI线程。如果有疑问,我甚至可以检查给定代码执行的线程。

使用异步/等待异步编程,我发现什么是明确的线程识别模糊和模糊(甚至很好地证明了调试堆栈根据众多期待的任务跳转到整个地方)。

我试图找到的是一种路线图,它可以帮助我识别沿着颠簸的异步/等待蜿蜒的跨线程危险区域/陷阱(原谅隐喻)。

在异步编程方面,我究竟应该注意什么来避免跨线程异常?这些可以制成某种清单吗?

1 个答案:

答案 0 :(得分:6)

我介绍了async intro中的主要线程注意事项。具体而言,await的默认行为是捕获“上下文”,然后在该“上下文”中恢复该方法。对于UI线程,该上下文将导致async方法在UI线程上恢复。

因此,简单asyncawait完全避免了大多数跨线程问题。

请注意,如果您确实介绍了后台线程(例如Task.Run),那么当然这些后台线程可能会导致跨线程异常,您必须适当地避免这些。