小编xam*_*mid的帖子

如何在没有AppDomain.GetCurrentThreadId()的情况下获取当前线程ID,以便它实际工作?

由于AppDomin.GetCurrentThreadId()已过时

"AppDomain.GetCurrentThreadId已被弃用,因为当托管线程在光纤(也称为轻量级线程)上运行时,它不提供稳定的Id.要获取托管线程的稳定标识符,请使用Thread上的ManagedThreadId属性 .http:// go .microsoft.com/fwlink /?linkid = 14202 "

我尽量不使用它.但是,'Thread.CurrentThread.ManagedThreadId'可以解释的解释是没有价值的,因为它没有提供Win32线程ID,这是Win32调用所需要的.所以我自己实现如下.

public sealed class AppDomainExtender
{
    public static int GetCurrentThreadId_New()
    {
        return Process.GetCurrentProcess().Threads.OfType<ProcessThread>().SingleOrDefault(x => x.ThreadState == System.Diagnostics.ThreadState.Running).Id;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在有两个问题.

  • 如果它可以工作,它不会与AppDomain.GetCurrentThreadId完全相同吗?
  • 它不起作用的原因是在循环通过SingleOrDefault循环时正在运行的线程可能会发生变化.这种行为很奇怪,但它只是让我产生了一个InvalidOperationException("Sequence包含多个元素").显然它发生在例如使用多个桌面时(我假设这只能通过将执行循环的线程复制到另一个id来实现).

问题:

  1. AppDomain.GetCurrentThreadId是否被错误地声明为过时?
  2. 如何制作语句"Process.GetCurrentProcess().Threads.OfType().SingleOrDefault(x => x.ThreadState == System.Diagnostics.ThreadState.Running).Id"atomic,还是甚至可能?

c# multithreading atomic appdomain

3
推荐指数
1
解决办法
2751
查看次数

标签 统计

appdomain ×1

atomic ×1

c# ×1

multithreading ×1