错误:操作已取消。

3

我正在使用这段代码片段来进行带有取消令牌的异步查询:

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

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

然而,当操作被取消时,cancellationToken.ThrowIfCancellationRequested();会抛出一个异常。我知道这行代码应该执行这件事。但是,在开发环境中,异常会导致Visual Studio停止工作。我该如何避免这种情况?


你所说的“将Visual Studio暂停”是指VS停止并显示“异常”对话框吗?无论是开发还是运行时,如果你没有处理异常,它都会导致应用程序失败。你需要捕获和处理异常以避免这种情况发生。 - G. Stoynev
@G.Stoynev 是的,VS会停止并显示“异常”对话框。那么,我应该在主线程还是异步线程中处理异常呢? - amiry jd
1个回答

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包装该调用(或等待其包含方法的位置)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接