我有一个任务,它查询活动目录并用结果填充列表。我已经设置了任务可以被取消,但是当取消被调用时,任务仍然继续执行。我知道任务已经被取消,因为它返回并运行在任务返回上意图执行的操作,但是查询仍在后台运行,使用内存和处理能力。任务可以重复启动和“取消”,每个任务迭代都会运行并使用资源。如何使取消实际上取消?
视图模型
视图模型
private async Task RunQuery(QueryType queryType,
string selectedItemDistinguishedName = null)
{
StartTask();
try
{
_activeDirectoryQuery = new ActiveDirectoryQuery(queryType,
CurrentScope, selectedItemDistinguishedName);
await _activeDirectoryQuery.Execute();
Data = _activeDirectoryQuery.Data.ToDataTable().AsDataView();
CurrentQueryType = queryType;
}
catch (ArgumentNullException)
{
ShowMessage(
"No results of desired type found in selected context.");
}
catch (OutOfMemoryException)
{
ShowMessage("The selected query is too large to run.");
}
FinishTask();
}
private void CancelCommandExecute()
{
_activeDirectoryQuery?.Cancel();
}
ActiveDirectoryQuery
public async Task Execute()
{
_cancellationTokenSource = new CancellationTokenSource();
var taskCompletionSource = new TaskCompletionSource<object>();
_cancellationTokenSource.Token.Register(
() => taskCompletionSource.TrySetCanceled());
DataPreparer dataPreparer = null;
var task = Task.Run(() =>
{
if (QueryTypeIsOu())
{
dataPreparer = SetUpOuDataPreparer();
}
else if (QueryTypeIsContextComputer())
{
dataPreparer = SetUpComputerDataPreparer();
}
else if (QueryTypeIsContextDirectReportOrUser())
{
dataPreparer = SetUpDirectReportOrUserDataPreparer();
}
else if (QueryTypeIsContextGroup())
{
dataPreparer = SetUpGroupDataPreparer();
}
Data = GetData(dataPreparer);
},
_cancellationTokenSource.Token);
await Task.WhenAny(task, taskCompletionSource.Task);
}
public void Cancel()
{
_cancellationTokenSource?.Cancel();
}
Cancel()
被一个绑定在Button
上的Command
调用。该任务可能需要几分钟才能执行完,并且可能会消耗数百兆字节的RAM。如果有帮助的话,我可以提供任何引用方法或其他信息。
IsCancellationRequested
属性,并相应地从任务中返回。Cancel
不只是“杀死”任务,它只是将该属性的值设置为 true。 - KDeckerThrowIfCancellationRequested()
。另请参阅如何:取消任务及其子级。 - Conrad Frix