为什么我的任务没有被取消?我正在运行一个进程,该进程会定期卷曲到URL列表以测试这些站点的性能。我的主程序基本上是一个do...sleep...while循环,每N秒调用一个函数runTest(),并通过键盘中断终止它。简单介绍了基础知识,我的代码如下:publicvoidrunTest(){if(isRunning){return;//加上一些记录,表明一项或多项测试尚未完成}try{isRunning=true;Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);CancellationTokenSourcects=newCancellationTokenSource(httpTimeoutValueMs*2);foreach(varurlinurls)taskList.Add(doAsyncCurls(url,cts))ListlistOfResults=Task.WhenAll(taskList.Select(x=>x)).Result.ToList();taskList.Clear();}catch{/*一些异常处理代码*/}finally{isRunning=false;Curl.GlobalCleanup();}}privatestaticasyncTaskdoAsyncCurls(stringurl,CancellationTokenSourcects){try{/*使用libCurl启动一个Curl*/Easyeasy=newEasy();easy.SetOpt(CURLoption.CURLOPT_URL,url);easy.SetOpt(CURLoption.CURLOPT_DNS_CACHE_TIMEOUT,0);//禁用DNS缓存easy.SetOpt(CURLoption.CURLOPT_CONNECTTIMEOUT,httpTimeoutValueMs/1000);//20秒超时任务t=newTask(()=>easy.Perform(),cts.Token);t.开始();等待;returnnewCurlResults(/*有效结果参数*/);}catch(TaskCanceledException){/*调用取消令牌*/returnnewCurlResults(/*无效结果参数*/);}catch(Exceptione){/*其他异常处理*/returnnewCurlResults(/*无效结果参数*/);“doAsyncCurl”函数按照它在罐子上所说的那样做,将http超时值设置为取消令牌的一半,以便HTTP请求应该在取消令牌被调用之前消失并生成否定结果我添加了取消令牌来尝试并如下所示处理我的问题。我让它运行了很长时间-起初,一切正常,但最终(通过数百次,如果不是更多的常规runTest()调用迭代)似乎其中一个任务卡住了并且没有调用取消令牌,并且curl测试过程有效卡死。除了选择哪些URL有问题(并且它们都有效)之外,还可以做些什么来诊断哪里出了问题?还是我构建的并行Curl完全错误?(我很高兴我可以将新的Curls实例化到上一轮已经完成的URLs,让悬空的URLs挂起,而不是在开始新的批次之前等待它们全部完成,但我并不担心这种效率提升).取消时没有自动化。您必须检查取消状态并结束执行或调用CancellationToken.ThrowIfCancellationRequested来执行取消。CancellationToken将告诉您是否请求取消;取消必须由您自己完成。下面一行是你的问题:Taskt=newTask(()=>easy.Perform(),cts.Token);您正在将令牌传递给任务构造函数。如果您在任务开始前取消,这将对您有所帮助。任务启动后,execute方法负责取消。easy.Perform()不知道您的取消标记,因此永远无法确定是否请求了取消。所以它会运行到最后。您需要在任务执行期间定期检查取消令牌以实现您的要求。以上是C#学习教程:为什么我的任务没有被取消?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
