问题描述
当我使用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。