取消来自第三方库的回调中的任务



在我的代码中,我正在创建一个调用第三方库的任务。此库可能需要很长时间。它有一个回调来提供有关其所在位置的状态(用于更新我的 UI 以让用户知道这项工作正在进行中(。

我无法访问此库中的代码 - 它就是这样。我可以在回调中抛出一个异常来强制它传播回我调用库的位置吗?是的,它有效,但是在任务中执行此操作有什么缺点吗?

我抛出操作取消异常有什么缺点吗?还是应该只由任务代码抛出?

如果第三方代码确实在其状态回调中抛出异常时会停止,您肯定可以使用它。 您需要完全了解此第三方代码如何处理这种情况。 也许它会优雅地停止并使用 try/finally 清理资源,然后再冒出异常。 也许没有。

如果您在Task中启动了该异常,并且第三方代码在内部没有捕获该异常,则默认情况下,异常将流向Task.Exception并且状态将变为TaskStatus.Faulted

你抛出什么样的异常并不重要,只要它没有被捕获,除非你想在什么地方被捕获。 抛出OperationCanceledException会起作用,但要认识到它不会自动将其他CancellationToken实例设置为取消。 您必须在关联的CancellationTokenSource上单独执行此操作。

最新更新