任务似乎自动启动

我正在移植一个具有非常长的加载时间的程序,当我移植它时根本没有改进,因为缓慢是因为访问数据库服务器(而不是次优代码)。 我已经使用Tasks库将加载移动到一个单独的线程上,现在UI在加载时不会冻结,但它确实让我对某些东西感到好奇:

Task.Factory对象有一个方法StartNew ,它应该创建一个新任务,启动它,并返回对它的引用。 这是有道理的,但似乎Task构造函数完成了同样的事情。

当我执行以下操作时:

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

我收到一个错误InvalidOperationException ,我真的不明白。 它似乎相信我已经把它踢掉了。 我还没有。

[编辑]

erorr是:“InvalidOperationException,可能无法在已完成的任务上调用Start”

[编辑]

错误是我包含的一些取消代码。 我需要在尝试再次运行之前重置取消。

现在我觉得很愚蠢,但让别人从我的“绿色”(如“新”,“没经验”)错误中学习是有益的:

我需要有问题的操作可以取消和重新运行,所以我实现了一个“CancelLoad”操作,它总是在执行实际加载之前运行。 事实certificate,我忘了在取消和等待后创建一个新的令牌。

我无法重现那种行为。 以下代码仅在您调用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); } } 

我的猜测是,不知怎的,你正在创建多个任务并启动其中一些任务,其中一些根本没有。 如果您可以展示一个类似的简短但完整的程序来certificate问题,我们应该能够提供更多帮助。

我的猜测更多与UI相关:我认为您可能在AddCategoriesFromDB(cts.Token)中尝试更新UI的代码。 但是,由于您现在所处的线程与UI不同,因此对UI的更新将引发错误。 是这样的吗?