sqlite-net-pcl在MAUI应用同步初始化时崩溃问题排查
崩溃原因分析
同步阻塞引发死锁:MAUI的UI线程带有
SynchronizationContext,当你用GetAwaiter().GetResult()同步等待异步的InitializeDatabase()方法时,UI线程会被彻底阻塞。而方法内的await默认会尝试将后续执行逻辑切回原上下文(已被阻塞的UI线程),形成“UI线程等待异步操作完成,异步操作等待UI线程释放”的死锁,最终导致程序崩溃。死锁状态下异常无法正常抛出,所以没有错误提示。SQLiteAsyncConnection的线程上下文依赖:
SQLiteAsyncConnection的异步操作内部依赖当前线程上下文管理连接状态,同步阻塞的方式破坏了上下文的正常流转,使得创建表的操作无法获取必要的执行环境,直接引发崩溃。Task.Run正常执行的逻辑:
Task.Run将异步操作调度到线程池线程执行,此时await后续逻辑会回到线程池上下文,不会占用UI线程,既避开了死锁,也符合SQLite异步操作的线程要求,因此能顺利完成数据库初始化。
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

