Задачи запускаются автоматически - PullRequest
3 голосов
/ 13 декабря 2010

Я портирую программу, у которой было очень долгое время загрузки, которое вообще не улучшалось, когда я ее переносил, так как медлительность была из-за доступа к db-серверу (а не к неоптимальному коду).Я переместил загрузку в отдельный поток с библиотекой Tasks, и теперь пользовательский интерфейс не зависает при загрузке, но меня это кое-что заинтересовало:

У объекта Task.Factory есть методStartNew, который должен создать новое задание, запустить его и вернуть ссылку на него.Это имеет смысл, но кажется, что конструктор Task делает то же самое.

Когда я делаю следующее:

Task catsFromDB = new Task(() => AddCategoriesFromDB(cts.Token), cts.Token);
catsFromDB.Start();

Я получаю ошибку InvalidOperationException, которую я действительноне понимаюКажется, я верю, что это уже началось.Что у меня нет.

[EDIT]

Ошибка: «InvalidOperationException, Start не может быть вызван для задачи, которая завершила»

[РЕДАКТИРОВАТЬ]

Ошибка - код отмены, который я включил.Мне нужно было сбросить отмену, прежде чем пытаться запустить его снова.

Ответы [ 3 ]

5 голосов
/ 13 декабря 2010

Теперь я чувствую себя глупо, но будет поучительно позволить другим учиться на моей «зеленой» (как в «новой», «неопытной») ошибке:

Мне нужно, чтобы рассматриваемая операция была отменяемой и повторно запускаемой, поэтому я реализовал операцию «CancelLoad», которая всегда выполнялась перед выполнением фактической загрузки. Оказывается, я забыл создать новый токен после отмены и ожидания.

1 голос
/ 13 декабря 2010

Я не могу воспроизвести это поведение.Приведенный ниже код запускает задачу только тогда, когда вы вызываете Start.

using System;
using System.Threading;
using System.Threading.Tasks;

class Test
{
    static void Main()
    {
        var cts = new CancellationTokenSource();
        Console.WriteLine("Creating task...");
        Task task = new Task(() => Console.WriteLine("Task executing"),
                             cts.Token);
        Console.WriteLine("Sleeping...");
        Thread.Sleep(1000);
        Console.WriteLine("Starting task...");
        task.Start();
        Thread.Sleep(1000);
    }
}

My догадываюсь , что вы как-то создаете несколько задач и запускаете некоторые из них дважды, а некоторыеих совсем нет.Если вы можете показать похожую короткую, но полную программу, которая демонстрирует проблему, мы сможем помочь больше.

0 голосов
/ 13 декабря 2010

Я думаю, что больше связано с пользовательским интерфейсом: я думаю, что вы можете иметь код в AddCategoriesFromDB(cts.Token), который пытается обновить пользовательский интерфейс. Однако, поскольку вы сейчас находитесь в другом потоке, нежели пользовательский интерфейс, ваши обновления пользовательского интерфейса будут вызывать ошибки. Это тот случай?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...