多实例WebView2应用共享用户数据文件夹的消息阻塞问题
你的问题核心是WebView2共享用户数据文件夹(UDF)时,触发了底层的跨实例资源同步机制,阻塞了MFC应用的主线程消息循环,具体原因如下:
UDF的排他性文件锁:WebView2的用户数据文件夹包含缓存、配置、Cookie等关键文件,当多个实例共享同一UDF时,WebView2会通过排他文件锁保护这些资源的一致性。即使你在加载文档时没有主动操作WV2,WV2的后台组件(如
msedgewebview2.exe渲染进程或主进程内的COM接口)可能在后台访问UDF,持有锁的同时会阻塞另一个实例的WV2组件对UDF的访问请求。由于你的MFC应用主线程运行在单线程单元(STA)中,WV2的COM调用会在主线程执行,同步等待锁释放的操作会直接卡住主线程的GetMessage调用,导致消息循环停滞。跨实例进程同步冲突:共享UDF时,WebView2会尝试复用同一个后台渲染进程,这个进程的内部同步逻辑会跨实例生效。WV2的后台维护任务(比如缓存同步、状态更新)可能触发跨实例的同步等待,导致你的应用主线程被挂起,无法处理用户输入或系统消息,表现为实例无响应。
COM线程模型的放大效应:MFC复合文档应用依赖STA线程模型,STA线程要求消息循环持续运行以完成COM对象的跨线程调度。当共享UDF导致WV2的COM调用进入同步等待时,STA线程会被占用,无法处理消息队列中的事件,直到锁释放或同步操作完成,这就解释了spyxx观察到的无消息传递现象。
当你为每个实例指定独立UDF时,每个WV2实例会创建独立的后台进程和文件资源,不存在跨实例的锁竞争或同步依赖,因此主线程消息循环能正常运行,另一实例不会被阻塞。
内容的提问来源于stack exchange,提问作者RDH

