Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多线程中调用静态方法_C#_Multithreading - Fatal编程技术网

C# 在多线程中调用静态方法

C# 在多线程中调用静态方法,c#,multithreading,C#,Multithreading,考虑以下代码: public class Test { public void Print() { lock (this) { System.Threading.Thread.Sleep(10000); Console.WriteLine("Print"); } } public static vo

考虑以下代码:

public class Test
{
        public void Print()
        {
            lock (this)
            {
                System.Threading.Thread.Sleep(10000);
                Console.WriteLine("Print");
            }
        }
        public static void Somthing()
        {
            Console.WriteLine("Somthing");
        }
}
print
方法I
lock
中,类和
Somthing
是一个静态方法。我希望在调用
Somthing
之后调用
Print
时,
Somthing
单独运行线程,因为我没有用于调用
Somthing
Test
实例

private static void Main(string[] args)
{
     var test = new Test();
     test.Print();
     Test.Somthing();
}
但是当写上面的代码时,
Test
锁定,然后调用
Somthing

private static void Main(string[] args)
{
     var test = new Test();
     test.Print();
     Test.Somthing();
}

为什么编译器会有这种行为?

这里没有任何东西会导致使用另一个线程;为什么会这样?您的代码:

  • 创建
    Test
  • 在该实例上调用(
    callvirt
    Print
    • 它需要一个
      监视器
      锁(顺便说一句,这不是个好主意)
    • 睡10秒钟
    • 向控制台写入一行
    • 释放
      监视器
  • 调用(
    call
    )静态
    Something
    方法
    • 它会向控制台写入一行
不需要额外的线程。我应该强调:即使您没有释放
监视器
锁(使用
监视器。在不使用
监视器的情况下输入
。退出
),它对线程的作用也是相同的;同样:
lock
不会创建线程


lock
只需停止(阻塞)other线程在
lock
期间锁定同一对象-它会创建一个互斥区域。它不会创建线程。

这里没有任何东西会导致使用另一个线程;为什么会这样?您的代码:

  • 创建
    Test
  • 在该实例上调用(
    callvirt
    Print
    • 它需要一个
      监视器
      锁(顺便说一句,这不是个好主意)
    • 睡10秒钟
    • 向控制台写入一行
    • 释放
      监视器
  • 调用(
    call
    )静态
    Something
    方法
    • 它会向控制台写入一行
不需要额外的线程。我应该强调:即使您没有释放
监视器
锁(使用
监视器。在不使用
监视器的情况下输入
。退出
),它对线程的作用也是相同的;同样:
lock
不会创建线程


lock
只需停止(阻塞)other线程在
lock
期间锁定同一对象-它会创建一个互斥区域。它不创建线程。

lock
只是避免另一个线程访问要访问的块中的代码,直到返回句柄为止。在您的情况下,实际上只有一个线程(外部锁)。lock语句中的代码不会被任何东西锁定。代码以同步方式执行,这意味着线程在指定的时间内休眠,然后调用Something方法。

lock只是避免另一个线程访问块内的代码,直到返回句柄为止。在您的情况下,实际上只有一个线程(外部锁)。lock语句中的代码不会被任何东西锁定。代码被同步执行,这意味着线程在指定的时间内休眠,然后调用Something方法。

我认为lock(this)锁定当前实例,静态方法不绑定到任何特定的实例,而是绑定到类类型本身,因此产生了严重的混乱。不过,我会让更有见识的人给出一个连贯的答案,因为我很可能是错的……:)锁定本身并不会创建单独的线程,它只是锁定访问,以便一次只能有一个线程进入。如果一切都像代码一样在单个线程中调用,那么锁定也不会真正起作用。在示例代码中,我只看到一个线程?建议您避免为公共可访问的类型锁定
this
。“我希望在打印后调用Somthing时,Somthing单独运行线程”。为什么会这样?我相信
lock(this)
会锁定当前实例,而静态方法不会绑定到任何特定实例,而是绑定到类类型本身,因此会产生严重的混淆。不过,我会让更有见识的人给出一个连贯的答案,因为我很可能是错的……:)锁定本身并不会创建单独的线程,它只是锁定访问,以便一次只能有一个线程进入。如果一切都像代码一样在单个线程中调用,那么锁定也不会真正起作用。在示例代码中,我只看到一个线程?建议您避免为公共可访问的类型锁定
this
。“我希望在打印后调用Somthing时,Somthing单独运行线程”。你为什么这么想?