繁体   English   中英

任务说明

[英]Explanation on Tasks

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

这是服务代码的一些部分

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(我怀疑),或者有什么我完全失踪?

有没有办法创建一个任务而不给它一个ID(我怀疑),或者有什么我完全失踪?

是的,只需使用:

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

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

我知道这不是你的代码开始,但像Reed说的那样,你不应该排队Task 您应该为工作项排队。

看看TPL DataFlow 甚至还有一份介绍性文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM