前台处于死循环时,Background Worker仍可运行?原因解析
为什么不用Sleep后台线程也能运行?
抢占式线程调度在起作用:Windows采用抢占式多任务调度机制,会给每个线程分配几毫秒的时间片。哪怕前台主线程在执行死循环,当它的时间片用完后,操作系统会暂停主线程,切换到其他就绪线程(比如BackgroundWorker的工作线程)执行。所以后台线程照样能获取CPU时间,完成任务后触发事件修改
m_NfcScriptRunning变量。BackgroundWorker的线程独立并行:BackgroundWorker默认使用.NET线程池中的线程执行后台任务,这些线程和前台主线程是并行的独立执行单元。只要后台任务没有被阻塞,操作系统就会主动调度它运行,不需要前台线程调用Sleep来主动让出CPU资源。
隐藏的线程安全风险
虽然你的代码当前能正常运行,但存在潜在问题:m_NfcScriptRunning是跨线程访问的变量,未使用任何线程同步机制(比如volatile关键字、锁或Interlocked类)。主线程可能会缓存该变量的本地副本,导致无法及时感知到后台线程对变量的修改,极端情况下可能出现死循环。建议给变量添加volatile修饰:
private volatile bool m_NfcScriptRunning;
这样可以确保主线程每次读取变量时,都会直接从内存中获取最新值,而非使用缓存的副本。
内容的提问来源于stack exchange,提问作者Digilee
相关产品推荐
相关产品推荐

