Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Parallel.invoke - Fatal编程技术网

C# 调用和线程调用-澄清?

C# 调用和线程调用-澄清?,c#,multithreading,parallel.invoke,C#,Multithreading,Parallel.invoke,我有一段代码会造成死锁: void Main() { ClassTest test = new ClassTest(); lock(test) { Task t1 = new Task(() => test.DoWorkUsingThisLock(1)); t1.Start(); t1.Wait(); } } public class ClassTest { public void DoWorkU

我有一段代码会造成死锁:

void Main()
{
    ClassTest test = new ClassTest();
    lock(test)
    {

        Task t1 = new Task(() => test.DoWorkUsingThisLock(1));
        t1.Start();
        t1.Wait();

    }
}

public class ClassTest
{
    public void DoWorkUsingThisLock(int i)
    {
        Console.WriteLine("Before " + i);
        Console.WriteLine ("Current Thread ID is = "+Thread.CurrentThread.ManagedThreadId);
        lock(this)
        {
            Console.WriteLine("Work " + i);
            Thread.Sleep(1000);
        }
        Console.WriteLine("Done " + i);
    }
}
结果:

在1之前
(和僵局……)

我知道锁定代码无法控制的实例或,
this
是一种不好的做法。但这只是为了这个问题

我能理解为什么这里会出现死锁

主线程在
main
中获取
lock(test)
,然后一个新线程开始调用
doworkingslock
——在那里它尝试获取同一实例变量上的锁,但它被卡住了(因为
t1.Wait()
at
main

但我看到了这个答案,它也造成了僵局

void Main()
{
    ClassTest test = new ClassTest();
    lock(test)
    {
        Parallel.Invoke (
            () => test.DoWorkUsingThisLock(1),
            () => test.DoWorkUsingThisLock(2)
        );
    }
}

public class ClassTest
{
    public void DoWorkUsingThisLock(int i)
    {
        Console.WriteLine("Before ClassTest.DoWorkUsingThisLock " + i);
        lock(this)
        {
            Console.WriteLine("ClassTest.DoWorkUsingThisLock " + i);
            Thread.Sleep(1000);
        }
        Console.WriteLine("ClassTest.DoWorkUsingThisLock Done " + i);
    }
}
结果是:

在ClassTest.d之前,使用ISLOCK 1工作
在ClassTest.d之前,使用Islock 2工作

ClassTest.doworkingIslock1//类使用当前线程执行部分工作。这是一个很好的性能优化,但在特定于线程的状态下是可以观察到的

TPL在很多地方都有这种“内联执行”,它以不同的方式造成了很多麻烦。许多程序不是用来处理重入的