我正在移植一个加载时间很长的程序,当我移植它时根本没有改进,因为速度慢是因为访问数据库服务器(而不是次优代码)。我已经使用 Tasks
库将加载移动到一个单独的线程上,现在 UI 在加载时不会卡住,但这确实让我对某些事情感到好奇:
Task.Factory
对象有一个方法 StartNew
,它应该创建一个新任务,启动它,并返回对它的引用。这是有道理的,但似乎 Task
构造函数做了完全相同的事情。
当我执行以下操作时:
Task catsFromDB = new Task(() => AddCategoriesFromDB(cts.Token), cts.Token);
catsFromDB.Start();
我收到一个错误 InvalidOperationException
,我真的不明白。它似乎相信我已经开始了。我没有。
[编辑]
错误是:“InvalidOperationException,可能无法在已完成的任务上调用启动”
[编辑]
错误是我包含的一些取消代码。在尝试再次运行之前,我需要重置取消。
最佳答案
现在我觉得自己很愚蠢,但让其他人从我的“绿色”(如“新手”、“没有经验”)错误中吸取教训会很有启发:
我需要有问题的操作可以取消和重新运行,所以我实现了一个“CancelLoad”操作,它总是在执行实际加载之前运行。原来是我取消了等着忘记创建新的Token了。
关于c# - 任务似乎自动开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4429480/