[英]Several tasks cancellation
有一个首要任务启动了另一个任务。
var token = _cancellationTokenSource.Token;
_task = new Task(() => WorkAction(this, token), token); //Top level task
内部任务实现为:
public string FindDevice(IProgressViewModel progressViewModel,
CancellationToken cancellationToken) {
for (int i = 0; i < orderedComPortsList.Count; i++) {
try {
cancellationToken.ThrowIfCancellationRequested();
} catch (OperationCanceledException) {
return null;
}
string curPort = orderedComPortsList[i];
if (InnerIsDeviceOnline(deviceModelId, curPort)) //The real long work
return curPort;
progressViewModel.CurrentValue = i;
}
return null;
}
通过此实现,仅当最后一个InnerIsDeviceOnline结束时才会取消。 如何实现FindDevice使其立即可取消?
更新1。
我们可以做这样的事情吗:
bool? result = null;
Task<bool> parent = new Task<bool>(() => {
bool? res = result;
Task.Factory.StartNew(() => {
while (res==null) {
cancellationToken.ThrowIfCancellationRequested();
Thread.Sleep(50);
}
}, TaskCreationOptions.AttachedToParent);
result = InnerIsDeviceOnline(deviceModelId, comPort);
return result.Value;
}, cancellationToken);
return parent;
它的问题是它永远不会完成(我不知道为什么)。 但这使我们立即被取消。
为了适当地取消长时间运行的操作,您的整个API需要以所需的特定粒度支持取消。 如果长时间运行的API不支持CancellationToken
,则需要提供一个接口层来提供该支持。 例如,异步WebRequest.BeginGetResponse
不支持CancellationToken
,但是我可以通过此扩展方法来支持它,该方法调用Abort()
以响应CancellationToken
被取消:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.