C#学习教程:在递归函数中使用Async/Await时控制任务总数它通过进行REST调用递归地在Web系统中创建文件夹。所以基本上,它为根节点创建一个文件夹,然后并行并递归地调用自身来获取所有子节点。(对于每个孩子)代码的唯一问题是,如果一个节点也有孩子,或者如果层次结构太深,那么我就会开始收到“TaskCancellation”错误。我试过将超时时间增加到10分钟。但这并没有解决问题。所以我的问题是如何开始说50个任务,然后等待一些东西被释放,并且只有在有50个空位时才继续。目前我认为我的代码在流经层次结构时没有任何限制地创建任务。publicasyncTaskCreateSPFolder(Nodenode,HttpClientclient,stringdocLib,stringcurrentPath=null){stringnodeName=Uri.EscapeDataString(nodeName);varrequest=new{__metadata=new{type="SP.Folder"},ServerRelativeUrl=nodeName};字符串jsonRequest=JsonConvert.SerializeObject(请求);StringContentstrContent=newStringContent(jsonRequest);strContent.Headers.ContentType=MediaTypeHeaderValue.Parse("application/json;odata=verbose");HttpResponseMessageresp=awaitclient.PostAsync(cmd,strContent);如果(resp.IsSuccessStatusCode){currentPath=(currentPath==null)?节点名称:当前路径+“/”+节点名称;}else{字符串内容=awaitresp.Content.ReadAsStringAsync();控制台.WriteLine(内容);thrownewException("创建文件夹失败"+content);}}列表taskList=newList();node.Children.ToList().ForEach(c=>taskList.Add(CreateSPFolder(c,client,docLib,currentPath)));任务.WaitAll(任务列表.ToArray());}你可以使用SemaphoreSlim来控制并发任务数你将信号量初始化为你想要的最大任务数,然后在每次执行任务时获取信号量,然后在任务完成时释放它。这是代码的一个稍微简化的版本,它使用随机数永远运行并同时执行最多2个任务。类程序{私有静态SemaphoreSlim信号量=newSemaphoreSlim(2,2);publicstaticasyncTaskCreateSPFolder(intfolder){try{awaitsemaphore.WaitAsync();Console.WriteLine("正在执行"+folder);Console.WriteLine("WaitAsync-CurrentCount"+semaphore.CurrentCount);等待任务。延迟(2000);}最后{Console.WriteLine("FinishedExecuting"+folder);信号量.Release();Console.WriteLine("Release-CurrentCount"+semaphore.CurrentCount);}varrand=newRandom();varnext=rand.Next(10);varchildren=Enumerable.Range(1,next).ToList();Task.WaitAll(children.Select(CreateSPFolder).ToArray());}staticvoidMain(string[]args){CreateSPFolder(1).Wait();控制台.ReadKey();首先,我认为你的问题不是任务的数量,而是在Task.WaitAll(taskList.ToArray());等待Task.WaitAll(taskList.ToArray());的阻塞线程数.在这种情况下,最好等待异步(即等待Task.WhenAll(taskList);其次,您可以将TPLDataflow的ActionBlock与MaxDegreeOfParallelism设置为50并为您要创建的每个文件夹发出。这样您可以执行一个平面工作队列,清空后就大功告成了。伪代码:以上是C#学习教程:在递归函数中使用Async/Await时控制任务总数需要了解更多的C#学习教程,希望大家多多付出注意—varblock=newActionBlock(asyncfolderInfo=>{awaitCreateFolderAsync(folderInfo);foreach(varsubFolderinGetSubFolders(folderInfo)){block.Post(subFolder);}},newDataFlowExecutionOptions{MaxDegreeOfParallelism=5});块.Post(rootFolderInfo);本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,转载请注明出处:
