【问题标题】:Error: The operation was canceled错误:操作已取消
【发布时间】:2025-12-23 22:00:12
【问题描述】:

我正在使用此代码 sn-p 使用取消令牌执行异步查询:

var _client = new HttpClient( /* some setthngs */ );

_client.GetAsync(someUrl, cancellationToken).ContinueWith(gettingTask => {
    cancellationToken.ThrowIfCancellationRequested();
    SomeStuffToDO();
    }, TaskScheduler.FromCurrentSynchronizationContext());
}, TaskScheduler.FromCurrentSynchronizationContext());

但是,当操作被取消时,cancellationToken.ThrowIfCancellationRequested(); 会抛出异常。我知道这条线应该是这个东西。但是,在开发环境中,异常会导致视觉工作室中断。我怎样才能避免这种情况?

【问题讨论】:

  • 您的意思是“Visual Studio 休息一下”,VS 会停止并显示“异常”对话框吗?开发或运行时,如果您不处理异常,它将导致您的应用程序失败。您需要捕获并处理异常以避免这种情况。
  • @G.Stoynev 是 VS 停止并显示“异常”对话框。那么,我在哪里可以处理异常?在主线程还是异步?

标签: c#-4.0 asynchronous async-await cancellation cancellationtokensource


【解决方案1】:

你需要在 lambda 内处理,像这样:

var _client = new HttpClient( /* some setthngs */ );

_client.GetAsync(someUrl, cancellationToken).ContinueWith(gettingTask => {
    try {
     cancellationToken.ThrowIfCancellationRequested();
     SomeStuffToDO();
    }
    catch (...) { ... }
    finaly { ... }
    }, TaskScheduler.FromCurrentSynchronizationContext());
}, TaskScheduler.FromCurrentSynchronizationContext());

_client.GetAsync(someUrl, cancellationToken) 也可能抛出取消​​异常,因此您需要使用 try-catch 包装该调用(或等待其包含方法的位置)。

【讨论】: