【问题标题】:Cancel an asynchronous call (IAsyncResult)取消异步调用 (IAsyncResult)
【发布时间】:2013-05-11 17:22:58
【问题描述】:

我正在.net WPF 中编程。

我有一个(第三方)API,它实现了 Begin/End 异步调用模式。 BeginWork() 函数返回一个 IAsyncResult。

但是,一旦完成,没有明显的方法可以取消/中止调用。

有没有办法停止这样的工作?如果这需要库作者明确提供取消方法,那么有什么方法可以杀死这项工作,即使是不优雅的?我真的需要能够以某种方式阻止它,因为一项工作可能需要几个小时才能完成!

谢谢!

【问题讨论】:

  • 那么,它是哪个特定的 API?但是:如果他们不公开取消,我不会认为您可以取消它。
  • @ilansch 我不清楚 WCF 帖子是否一定适用于此...有很多 async / IAsyncResult API,它们的行为不同
  • 这是亚马逊的 S3 上传。但是我昨天就那个图书馆提出了一个具体的问题,但没有得到答案。所以我转而想到了一种通用的方法来终止异步任务。 stackoverflow.com/questions/16485629/…
  • 理论上你可以create a separate AppDomain在其中运行线程,然后你就可以关闭整个应用程序域。但这需要大量的工作和communicating between app domains needs WCF 或一些类似的机制。

标签: c# wpf


【解决方案1】:

如果实现不包含允许取消的特定代码,那么您很可能无法取消它。并非所有事情都可以在逻辑上完全取消,尤其是在涉及外部资源的情况下。但是,如果取消它的代码根本没有被编写。 .您可以尝试随机杀死线程,但这会破坏您的进程-基本上这与决定中途杀死整个进程相同。它会停止工作,但如果不是事务性的,它可能会使事情变得一团糟。

如果我是你,我会(其中之一):

  • 向第 3 方索要支持的取消 API
  • 除非您确定,否则不要启动它

【讨论】:

  • 另外值得注意的是@Palantir 可能支持逻辑取消,因此它看起来好像操作已被取消,而实际上它仍在后台运行,结果将被丢弃最终完成。
  • 如果操作足够快,那可以工作。但是如果操作可能需要几个小时,那么很遗憾不再可以接受:(
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多