我有一個場景,我有幾個後臺任務(TPL任務),它們運行在各自的時間表上。任務1被認爲具有比任務2更高的優先級。如何暫停並繼續進行TPL任務?
如果調度程序想要運行任務1,則需要檢查任務2是否正在運行,並在任務1完成執行時暫停它。
這甚至可能嗎?如果是的話,我怎麼能做到這一點?
我有一個場景,我有幾個後臺任務(TPL任務),它們運行在各自的時間表上。任務1被認爲具有比任務2更高的優先級。如何暫停並繼續進行TPL任務?
如果調度程序想要運行任務1,則需要檢查任務2是否正在運行,並在任務1完成執行時暫停它。
這甚至可能嗎?如果是的話,我怎麼能做到這一點?
您可以使用信號構造來實現此目的。
static ManualResetEvent mre = new ManualResetEvent(false);
var Task1=Task.Factory.StartNew(() =>
{
Console.WriteLine("Executing Task 1");
Thread.Sleep(2000); //A Long running operation
Console.WriteLine("Task 1 Completed");
mre.Set(); //signal the task completion to task 2.
});
var Task2=Task.Factory.StartNew(() =>
{
if (!Task1.IsCompleted) //check if task1 is completed.
{
mre.WaitOne(); //wait until Task 1 Completes
Console.WriteLine("Executing Task 2");
Thread.Sleep(2000);
Console.WriteLine("Task 2 Completed");
doSomeTask();
}
else
{
//Task 1 is already completed
doSomeTask();
}
});
感謝您的更新。我的理解是否正確,如果任務2已經開始,這將無濟於事?就我而言,這兩個任務實際上都是從應用程序中的不同線程開始的(完全在不同的地方)。 – ryadavilli
你的意思是說沒有保證哪個線程首先啓動? –
是的,這是正確的。 – ryadavilli
最簡單的,無阻塞的方法是Task.Delay
:
http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.delay(v=vs.110).aspx
// Some code here
await Task.Delay(2000); // Pause for 2 seconds, without blocking
// Code to execute after waiting
這不是什麼TPL是專爲。可能可以通過等待處理來解決這個問題,但它似乎走錯了路。重新審視讓你在這裏的設計。 –
感謝您的更新。我不確定是否值得提問。我目前的設計只有「任務1」,我已經實現了使用傳統線程。我剛剛開始研究TPL,並研究了等待和繼續方法,並希望有一些「簡單」的方法來實現我所要求的。 – ryadavilli