【发布时间】:2019-10-04 15:48:49
【问题描述】:
我有一个问题,我还没有找到任何答案。这是我第一个使用线程和任务的项目。当我的任务被取消时,它会继续执行耗时的方法。
现在我不知道如何停止执行该方法和任务。
下面是一个循环,它运行任务。每个任务都运行一个ParseHorseData 方法,该方法还运行其他几种方法。执行它们有时需要很长时间。
任务取消后,在await Task.WhenAll(tasks);完成之前,需要很多时间。
那么,和问题一样,有没有办法取消取消任务中方法的执行?
List<Task> tasks = new List<Task>();
int loopCounter = 0;
int taskCounter = 0;
//for all races in the file
for (int i = 0; i < _allRaces.Count; i ++)
{
int j = i;
if (TaskCancellation == true)
{
break;
}
Task task = Task.Run(async () =>
{
while (!_cancellationToken.IsCancellationRequested)
{
loopCounter++;
ProgressBarTick("Requesting historic data", loopCounter, _allRaces.Count, 0);
//if the race is from 2018
if (_allRaces[j].RaceDate.Year == 2018)
{
Category = _allRaces[j].RaceCategory;
Distance = _allRaces[j].RaceDistance.ToString();
//for all horses in the race
for (int h = 0; h < _allRaces[j].HorseList.Count; h++)
{
HorseDataWrapper horse = new HorseDataWrapper();
//TIME CONSUMING
horse = ParseHorseData(_allRaces[j].HorseList[h], _allRaces[j].RaceDate);
_allRaces[j].HorseList[h] = horse;
}
}
taskCounter++;
if (loopCounter >= _allRaces.Count)
{
ProgressBarTick("Testing on historic data", taskCounter, _allRaces.Count, 0);
}
}
}, _tokenSource.Token);
tasks.Add(task);
}
try
{
await Task.WhenAll(tasks);
}
catch (TaskCanceledException)
{
//
}
finally
{
_tokenSource.Dispose();
}
【问题讨论】:
-
您没有向我们展示耗时的方法......您应该将您的取消令牌传递给它,并定期检查它并在它被取消时抛出异常/中止。或者至少在内部循环中检查它,然后再进行循环的下一次迭代。目前,您的代码只有在整个循环运行后才有机会取消。
-
好吧,将
CancellationToken作为参数添加到解析器。所以你也可以在那里检查它并停止执行/返回。 -
Thsnks 伙计们,我找到了另一个解决问题的方法,但你们俩都启发了我。我的
for循环中已经有if (TaskCancellation == true)条件。任务调用的方法中的循环占用了大部分执行时间。按下取消 btn 后,不仅触发了CancellationToken,而且没有将ct参数传递给方法,而且在它们的循环中我使用if (TaskCancellation == true)到break它们。再次感谢您。
标签: c# wpf task cancellation