任务说明

时间:2014-02-26 21:08:14

标签: c# task

我想对我没有做过的代码做一些澄清,并且必须在服务中进行修改。

以下是服务代码的一些部分

private Thread _thread;
private ConcurrentQueue<Task> _tasks = new ConcurrentQueue<Task>();
private Task _runningTask = null;

protected override void OnStart(string[] args)
{
    _thread = new Thread(WorkerThreadFunc);
    _thread.IsBackground = true;
    _thread.Start();
}

private void WorkerThreadFunc()
{
    InitDb();

    while (!_shutdownEvent.WaitOne(1000))
    {
        if (_runningTask == null || _runningTask.IsCompleted)
        {
            Task task;
            if (_tasks.TryDequeue(out task))
            {
                _runningTask = task;
                _runningTask.Start();
            }
        }
    }
}


private void RunReport(int reportID)
{
    var task = new Task(id =>
    {
        //Task code
    }, reportID);

    _tasks.Enqueue(task);
}

所以,这一切都运作良好

问题是,我想将其他任务添加到任务队列中,但我没有任何ID来提供它们(代码中的任务运行报告并使用reportID,但其他任务不是特别是与一份报告相关联)。

有没有办法创建一个任务而不给它一个ID(我怀疑),还是有些东西我完全失踪了?

2 个答案:

答案 0 :(得分:3)

  

有没有办法创建一个任务而不给它一个ID(我怀疑),还是有些东西我完全失踪了?

是的,只需使用:

_tasks.Enqueue(new Task(() => {
       // Your code here
   });

话虽如此,这不是Task类的习惯用法。通常,TaskTask<T>类应始终运行 - 不会创建并在以后启动。

答案 1 :(得分:2)

我知道这不是你的代码,但是,就像Reed所说,你不应该排队Task。您应该改为对工作项进行排队。

看看TPL DataFlow。甚至有introductory document