繁体   English   中英

取消几个任务

[英]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被取消:

https://github.com/openstacknetsdk/openstack.net/blob/master/src/corelib/Core/WebRequestExtensions.cs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM