Статус задачи изменился на RanToCompletion во время работы стиля - PullRequest
0 голосов
/ 21 октября 2018

Я создал метод, который обрабатывает несколько проверок перед запуском Задачи, переданной в качестве параметра.

Моя проблема заключается в том, что созданная там задача не ведет себя должным образом и быстро рассматривается как RanToCompletion, несмотря на то, что код все ещеrunning.

Вот пример:

    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 представляет собой цикл с несколькими моментами, когда i await завершается внешним кодом.На первом await Task.WaiAll завершается и переходит к IsRunning = false

Я проверил этот поток , но это не та проблема, с которой я правильно использую асинхронныйtask, а не async void.

Кроме того, код использовался для правильной работы до того, как я переместил выполнение Task в метод AddToTasker.Раньше я делал вот так AddToTasker(Task.Run(() => ExtractAllOffer(localToken), localToken), TaskTypes.Extractor);, но я понял, что мне нужно выполнить проверки перед запуском Задачи, и мне нужно было учесть проверки внутри метода AddToTasker (у меня много вызовов этого метода).

Я вродеЯ понимаю, что в том, как я объявляю или запускаю свое задание, есть недостаток, но не могу понять, что.

Помощь, высоко оцененная

1 Ответ

0 голосов
/ 22 октября 2018

Благодаря @ pere57 и этому другому потоку я вижу, что ожидание только ждет, пока завершится действие, которое создает задание ... что довольно быстро.

Я должен объявитьэто как Задача <Задача>, чтобы развернуть первую Задачу (действие) для доступа к внутренней Задаче (фактическому методу, который выполняется).

Итак, пошло:

public Task Main(CancellationToken localToken)
{
    try
    {
        AddToTasker(new Task<Task>(() => 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> 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
     */

    mylistoftask.Add(task.Unwrap()); //I have now to unwrap the task to add the inner one in my list
    task.Start();

}

async private Task ExtractAllOffer(CancellationToken localToken)
{
    // *** Do very long Stuff ***
}
...