不要将纤程视为线程
更新:2007 年 11 月
TypeName |
DoNotTreatFibersAsThreads |
CheckId |
CA2003 |
类别 |
Microsoft.Reliability |
是否重大更改 |
否 |
原因
托管线程被视为 Win32 线程。
规则说明
不要将托管线程假定为 Win32 线程,它是纤程。CLR 会将托管线程作为 SQL 所拥有的真实线程之上的纤程来运行。这些线程将在 AppDomain 之间甚至 SQL Server 进程中的数据库之间共享。可以使用托管线程本地存储区,但不能使用非托管线程本地存储区,也不能假定代码将再次运行在当前操作系统线程上。不要更改类似线程区域设置这样的设置。不要通过 P/Invoke 调用 CreateCriticalSection 或 CreateMutex,因为它们需要能够进入锁也能够退出锁的线程。由于使用纤程不会出现上述问题,因此 Win32 临界区和 mutex 在 SQL 中毫无用处。您可以在托管 System.Thread 对象上安全地使用大部分状态,包括托管线程本地存储区和线程的当前 UI 区域性。但由于要使用编程模型,因此在 SQL 中运行时将不能更改线程的当前区域性,这一点将通过新的权限来强制实现。
如何修复冲突
检查线程的使用情况并对代码进行相应的更改。
何时禁止显示警告
不应禁止显示此规则。