首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消异步操作

取消异步操作
EN

Stack Overflow用户
提问于 2011-12-01 10:08:50
回答 1查看 1K关注 0票数 2

我正在开发实现协议栈的类库。在这里,我有一个实现IAsyncResult的异步操作IAsyncResult。该方法的用户可以使用BeginDoSomething和EndDoSomething。所以,这是一个相当常见的任务。

现在,我得到了使异步操作可中止的要求。我可以想出几种方法来实现这一点,但我不确定哪一种是最好的:

  1. 除了BeginDoSomething和EndDoSomething外,还有一个CancelDoSomething方法。这不是常见的asaync模式,因此不容易为operation.
  2. According的用户找到第1名:拥有一个Cancel属性
  3. ,由BeginDoSomething返回的IAsyncResult实例可以转换为DoSomethingAsyncResult。DoSomethingAsyncResult有一个取消方法。同样,这不是异步模式的常见用法,而且很难知道类library.
  4. According的“公共用户”是否为第3号:拥有一个Cancel属性
  5. -- BeginDoSomething实现IAbortableAsyncResult:public IAbortableAsyncResult:IAsyncResult { void Abort(); }返回的IAsyncResult实例。对我来说,这似乎是最优雅的方式。当用户使用BeginDoSomething启动操作时,他会得到IAbortableAsyncResult的一个实例,这意味着这个特殊特性将显着地介绍给他。

什么是最好的解决方案?还有更多的方法来解决这个问题吗?我更喜欢5号,因为它没有代码气味(至少直到现在我还没有认出它)。

编辑

一种不依赖于TPL/.NET 4的方法被认为有一种解决方案,它也适用于不能移植到最新版本的.NET框架的遗留代码中。

/EDIT

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-01 10:19:14

CancellationToken和CancellationTokenSource在4.0中被添加到.net中,从那时起就形成了一个常见的取消模式的基础。通常,异步方法有一个过载,需要一个CancellationToken。

当令牌被取消时,CancellationTokens的使用者可以注册回调,并使用回调停止执行。或者,如果任务不是特别长的执行,IsCanceled属性可以只是间歇地轮询。

CancellationToken是异步任务使用的接口,任务的发起者使用一个CancellationTokenSource来发出这个令牌,然后可能在将来取消它。

这种方法的优点之一,除了成为一种标准的消除方法之外,就是它是可组合的。如果该任务包含其他几个可取消的异步操作,则可以将相同的取消令牌传递给它们,并且取消应该自动完成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8339550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档