Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步编程中的跨线程异常_C#_Multithreading_Asynchronous - Fatal编程技术网

C# 异步编程中的跨线程异常

C# 异步编程中的跨线程异常,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,在同步编程中(在async/await出现之前),我很清楚如何或为什么会发生跨线程异常。如果我启动了一个后台线程来执行一些繁重的任务,以便卸载UI线程并使其响应,那么我完全知道如何从后台线程访问UI线程。如果有疑问,我甚至可以检查给定代码正在执行的线程 使用async/await异步编程,我发现线程的明确标识在某种程度上是模糊和模糊的(甚至在调试过程中得到了很好的证明,基于大量等待的任务,调用堆栈到处跳跃) 我试图找出的是一种路线图,它可以帮助我在崎岖不平的async/Wait弯道上识别跨线程的

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

使用async/await异步编程,我发现线程的明确标识在某种程度上是模糊和模糊的(甚至在调试过程中得到了很好的证明,基于大量等待的任务,调用堆栈到处跳跃)

我试图找出的是一种路线图,它可以帮助我在崎岖不平的async/Wait弯道上识别跨线程的危险区域/陷阱(请原谅这个比喻)


在异步编程中,我到底需要注意什么来避免跨线程异常?这些可以做成某种检查表吗?

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

因此,简单的
async
await
可以完全避免大多数跨线程问题


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

;如果在应该在后台运行的方法中使用
async
关键字,并且
等待结果,则需要在UI线程上执行
Invoke()
操作。与之前的async/await基本相同。。你说“我试图找到的是一种路线图”,这是指南或教程的另一种说法。这是度量标准。我认为你的问题离题了。改写它以改进它。祝你好运我要说的是,
async/await
如果操作正确,通常会避免跨线程GUI问题,而不是在以后尝试更新UI时(通过编组)自行启动工作线程<代码>异步/等待
也容易得多;不那么冗长。更少的代码通常意味着更少的bug。想避免这种例外情况吗?然后使用
async/await
是一个好方法start@E.Moffat如果你在现代应用程序中使用“调用”,那么你可能是做错了。正在等待你进入当前环境。有人否决了斯蒂芬?这太奇怪了。无论如何,我的+1在那里:)如果有人投票反对斯蒂芬,那一定是个错误。我只是想提高投票率,但我有限的声誉,再加上我的问题(低于投票所需的15票)使我无法投票。是的,投票否决斯蒂芬并希望这只是一场真正的灾难是很奇怪的。