我有几个后台任务(TPL 任务)按各自的时间表运行的场景。任务 1 被认为具有比任务 2 更高的优先级。
如果调度程序要运行任务 1,我需要检查任务 2 是否正在运行并在任务 1 完成执行时暂停它。
这甚至可能吗?如果是,我怎样才能做到这一点?
我有几个后台任务(TPL 任务)按各自的时间表运行的场景。任务 1 被认为具有比任务 2 更高的优先级。
如果调度程序要运行任务 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();
}
});
简单,非阻塞的方法是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