[英]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.