【发布时间】:2018-10-22 20:56:45
【问题描述】:
我创建了一个方法,它在启动作为参数传递的任务之前处理一些检查。
我的问题是,在那里创建的任务没有按预期运行,尽管代码仍在运行,但很快就会被视为 RanToCompletion。
这是一个例子:
public Task Main(CancellationToken localToken)
{
try
{
AddToTasker(new Task(async () => await ExtractAllOffer(localToken), localToken), TaskTypes.Extractor);
//this allows to extract only the task for the given task type through the list created in AddToTasker, actual code is not necessary the returned array is correct
Task.WaitAll(GetTasksArray(new TaskTypes[]{TaskTypes.Extractor}), localToken);
IsRunning = false;
}
}
public void AddToTasker(Task task, TaskTypes taskstype)
{
/*
* Whatever code to perform few check before starting the task
* among which referencing the task within a list which holds also the taskstype
*/
task.Start();
}
async private Task ExtractAllOffer(CancellationToken localToken)
{
// *** Do very long Stuff ***
}
ExtractAllOffer 方法是一个循环,有一会儿我 await 外部代码完成。在第一个await Task.WaiAll 终止并转到IsRunning = false
我检查了这个thread,但它似乎与我正确使用异步任务而不是异步无效的问题不同。
此外,在我在 AddToTasker 方法中转移任务执行之前,代码可以正常运行。在我以前这样做之前AddToTasker(Task.Run(() => ExtractAllOffer(localToken), localToken), TaskTypes.Extractor);,但我意识到我需要在启动任务之前执行检查,并且需要在 AddToTasker 方法中考虑检查(我对此方法有很多调用)。
我有点理解我声明或启动任务的方式存在缺陷,但不知道是什么。
帮助不胜感激
【问题讨论】:
-
Task构造函数和Task.Run的行为确实不同。请参阅此answer。这与您检查的链接相同,但可能解释更清楚。 -
感谢您的链接,它帮助很大。我有点明白发生了什么,但不知道该怎么做,我给出了正确的答案