【线程相关故障】在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

问题描述

当我使用timer控件创建线程来调用一个异步方法时出现的,线程里有richtextbox.invoke方法这也是报错的位置,并不是因为一开始控件没有初始化就调用timer,而是在timer运行几次后才出现的报错。

问题原因解决方法

在我调用异步方法时使用了,await来修饰执行的函数,而函数运行时间过长,timer间隔又太短,最终导致函数等待返回后的上下文丢失,在线程上使用invoke的时候报错

AsyncMethod是自己定义的异步函数
await AsyncMethod().ConfigureAwait(true);//显式调用 ConfigureAwait(true)来恢复上下文
或者
AsyncMethod().Result;//result会阻塞当前线程避免上下文丢失

小结

当异步操作完成后,如果没有正确的同步上下文,任务调度器会将后续代码分配到任意可用的线程池线程(线程 A)。线程 A 是一个普通的后台线程,它并不知道 UI 线程的存在,也没有权限访问 UI 控件。在这种情况下,this 对象仍然指向当前的窗体实例,但由于线程 A 不属于 UI 线程,因此无法直接访问 this.richTextBox。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值