2

独自のスケジュールで実行されるバックグラウンド タスク (TPL タスク) がいくつかあるシナリオがあります。タスク 1 は、タスク 2 よりも優先度が高いと見なされます。

スケジューラがタスク 1 を実行したい場合、タスク 2 が実行されているかどうかを確認し、タスク 1 の実行が完了するまで一時停止する必要があります。

これは可能ですか?はいの場合、どうすればこれを達成できますか?

4

2 に答える 2

5

これを実現するために、シグナリング コンストラクトを使用できます。

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();
    }

});
于 2012-10-31T09:01:14.947 に答える
1

簡単でブロックしない方法は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
于 2013-11-28T21:44:11.977 に答える