[英]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
类的惯用法。 通常, Task
和Task<T>
类应始终运行 - 不创建并在以后启动。
我知道这不是你的代码开始,但像Reed说的那样,你不应该排队Task
。 您应该为工作项排队。
看看TPL DataFlow 。 甚至还有一份介绍性文件 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.