【问题标题】:How can I pause and continue a TPL task?如何暂停和继续 TPL 任务?
【发布时间】:2012-10-31 08:17:22
【问题描述】:

我有几个后台任务(TPL 任务)按各自的时间表运行的场景。任务 1 被认为具有比任务 2 更高的优先级。

如果调度程序要运行任务 1,我需要检查任务 2 是否正在运行,并在任务 1 完成执行时暂停它。

这甚至可能吗?如果是,我该如何实现?

【问题讨论】:

  • 这不是 TPL 的设计目的。可能可以使用等待句柄来解决这个问题,但似乎走错了路。重新审视让您来到这里的设计。
  • 感谢您的更新。我也不确定,因此值得一问。我目前的设计只有“任务 1”,我已经使用传统的线程实现了它。我刚刚开始研究 TPL 并查看了 Wait 和 Continue 方法,并希望有一些“简单”的方法来实现我所要求的。

标签: c# multithreading task-parallel-library


【解决方案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 已经开始,我是否正确理解这无济于事?在我的例子中,这两个任务实际上都是从应用程序中的不同线程开始的(完全在不同的地方)。
  • 你的意思是说不能保证先启动哪个线程?
【解决方案2】:

简单的非阻塞方式是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

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多