gpt4 book ai didi

c# - 如何在任务中取消 web 服务请求,并在取消时做一些事情

转载 作者:太空宇宙 更新时间:2023-11-03 16:27:57 24 4
gpt4 key购买 nike

我们有一棵树,当用户点击任何节点时,它会从网络服务中查询数据,并置换结果。但是,有时需要时间。所以我尝试将 Web 服务调用包装在一个任务中。我想在任务尚未完成并且用户单击其他节点时取消任务。以下是我的示例代码。但是取消任务 block 不能执行,即使_cancelTokenSource.Cancel() 执行。 MSDN 提供的大多数示例都是基于 CPU 绑定(bind)的,而不是 I/O 绑定(bind)的。谁能告诉我如何全部取消网络服务?提前致谢

private void OnNodeClicked(int id)
{
if (_cancelTokenSource != null)
_cancelTokenSource.Cancel();

IsRunning = true;
var uiSchedule = System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext();
_cancelTokenSource = new CancellationTokenSource();
var loadDataTask = System.Threading.Tasks.Task.Factory.StartNew<int[]>(() =>
{
// Call web service here
}, _cancelTokenSource.Token);

loadDataTask.ContinueWith((result) =>
{
// Populate data
IsRunning = false;
}, CancellationToken.None, System.Threading.Tasks.TaskContinuationOptions.OnlyOnRanToCompletion, uiSchedule);

loadDataTask.ContinueWith((result) =>
{
// set cancel state here
IsRunning = false;
}, CancellationToken.None, System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled, uiSchedule);

最佳答案

CancellationTokenSource 及其标记是一个线程(或任务)查询另一个线程是否请求任务取消的一种方式。当然,这需要您编写代码来检查该 token (因此至少运行一次,通常是定期运行)。如果您已委托(delegate)给一些对任务或取消 token 一无所知的生成代码(Web 服务代理),那么您将无法使用它。

如果您使用 Begin 方法开始调用,则可以使用 WebClientAsyncResult.Abort() 中止调用。例如:

IAsyncResult ar = obj.BeginFunCall(5,5,null,null);
//...
if (!ar.IsCompleted) //if the request is not completed {
WebClientAsyncResult wcar = (WebClientAsyncResult)ar;
wcar.Abort();//abort the call to web service
}

关于c# - 如何在任务中取消 web 服务请求,并在取消时做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11932517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com