簡體   English   中英

C# 中的任務是否存在死鎖?

[英]Does exist deadlocks with Tasks in C#?

我有下面的代碼,當然我在使用線程時遇到了死鎖,但為什么任務不會發生?

private static object lockObject1 = new object();
private static object lockObject2 = new object();

static void Main(string[] args)
{
    Console.Title = "Deadlocks";

    //Using tasks.

    Task ourTask1 = new Task(SingleMethod_A);
    ourTask1.Start();

    Task ourTask2 = new Task(SingleMethod_B);
    ourTask2.Start();

    //Using threads.

    //Thread ourThread1 = new Thread(new ThreadStart(SingleMethod_A));
    //Thread ourThread2 = new Thread(new ThreadStart(SingleMethod_B));

    //ourThread1.Start();
    //ourThread2.Start();

    Console.WriteLine("Deadlock");
}

public static void SingleMethod_A()
{
    lock (lockObject1)
    {
        Thread.Sleep(1000); 
        lock (lockObject2)
        {
            Console.WriteLine("not possible.");
        }
    }
}

public static void SingleMethod_B()
{
    lock (lockObject2)
    {
        Thread.Sleep(1000); 

        lock (lockObject1)
        {
            Console.WriteLine("not possible.");
        }
    }
}

Task肯定會死鎖。 同樣重要的是要記住Task不是線程——它們可能在線程池中的一個線程上運行。

為什么你沒有看到它是因為你的案例是一個微不足道的例子並且.Start不必使用單獨的線程。 嘗試將調用更改為 start 到Task.Run(action)而不是查看死鎖:

Task.Run(() => SingleMethod_A());
Task.Run(() => SingleMethod_B());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM