C# WhenAll如何处理任务
在我的asp.net控制台应用程序中有以下代码,用于并行调用名为C# WhenAll如何处理任务,c#,asp.net,asynchronous,parallel-processing,C#,Asp.net,Asynchronous,Parallel Processing,在我的asp.net控制台应用程序中有以下代码,用于并行调用名为gettingCustomerInfo的方法,共20个请求,如下所示: 类程序 { 静态信号量LIM节流器=新信号量LIM(初始计数:20); 私有静态异步任务gettingCustomerInfo(字符串网站, 字符串电话,长公司ID) { wait throttler.WaitAsync(); ScanInfo si=new ScanInfo(){companyId=companyId}; 尝试 { //代码在这里。。。 } 最
gettingCustomerInfo
的方法,共20个请求,如下所示:
类程序
{
静态信号量LIM节流器=新信号量LIM(初始计数:20);
私有静态异步任务gettingCustomerInfo(字符串网站,
字符串电话,长公司ID)
{
wait throttler.WaitAsync();
ScanInfo si=new ScanInfo(){companyId=companyId};
尝试
{
//代码在这里。。。
}
最后
{
节流器释放();
}
}
静态异步任务主(字符串[]args)
{
布尔·哈斯莫尔=真;
字符串偏移量=string.Empty;
bool first=true;
尝试
{
while(hasmore | | first)
{
营销ipfd=新营销();
第一个=假;
尝试
{
//调用PM API以获取帐户id
使用(WebClient wc=new WebClient())
{
wc.Encoding=Encoding.UTF8;
字符串url=”https://api.hubapi.com/companies/v2/companies/" +
“paged?hapikey=*******属性=网站”+
“&properties=mse\u扫描&properties=phone”+
“&limit=“+100+”&offset=“+offset;
字符串tempurl=url.Trim();
var json=wc.DownloadString(tempurl);
ipfd=JsonConvert.DeserializeObject(json);
int rrr=ipfd.companys.Count();
offset=ipfd.offset;
hasmore=ipfd.hasmore;
}
}
捕获(例外e)
{
}
var tasks=ipfd.companies
.Select(c=>Task.Run(()=>gettingCustomerInfo
(
c、 properties.website.value,
(
c、 properties.phone!=null&&
!String.IsNullOrEmpty(c.properties.phone.value)?
c、 properties.phone.value:null
),
c、 公司ID
)
));
var结果=等待任务.WhenAll(任务);
}
}
}
}
现在我不知道我的代码的逻辑和流程将如何运行?现在在API调用中,我得到了100个项,然后在gettingCustomerInfo
中,我定义了一个SemaphoreSlim=20
。但我不确定我的代码流会是怎样的?有人能给我建议吗
编辑-1
现在,我在我的gettingCustomerInfo
方法中添加了以下内容:-
private static async Task<ScanInfo> gettingCustomerInfo(string website,string phone, long compnayId)
{
Console.WriteLine("a");
await throttler.WaitAsync();
ScanInfo si = new ScanInfo() { companyId = compnayId };
Console.WriteLine("b");
现在在api调用中我得到了100个项,然后在gettingCustomerInfo中我定义了一个信号量lim=20。但我不确定我的代码流会是怎样的
因此,公司
有100个项目,这些项目都是Select
ed到任务中的
当此代码调用Task.whalll
时,将创建所有100个任务,并调用gettingCustomerInfo
100次
对的前20个调用等待throttler.WaitAsync
将立即完成,并继续执行,运行//此处的代码
。当每个调用完成时,它将调用Release
,这将完成在wait throttler.WaitAsync
等待的80个调用中的一个
最后,所有100个调用都将完成运行
//这里的代码(一次不超过20个),然后等待任务。当所有的完成时。为什么不运行调试器并逐步检查代码以查看执行情况?@LarryBud不幸的是,可能有很多线程处于活动状态,调试可能是一项挑战,因为调试器会一直跳到另一个活动状态thread@LarryBud我试着这么做,但是我不知道流程将如何运行。我认为你问题中的代码有一些噪音,与你所问的无关,可以删除。但在斯蒂芬·克利里的回答之后,这可能没什么大不了的。我认为没有人能提供更好的答案。:-)谢谢你的澄清。那么,“静态信号量lim throttler=new信号量lim(initialCount:20)”是什么意思呢意思是这是否意味着它将确保一次运行的活动线程不超过20个?如果答案是肯定的,那么它是如何执行的?请检查我的编辑-1似乎100个任务不会在once@JohnJohn:是的,它可以确保一次最多运行20次。它通过保存等待任务的列表来实现这一点。这100个任务不会同时启动,因为您在线程池线程上启动它们,并且线程池的注入速率有限。
a
a
a
a
a
a
a
b
b
a
b
a
b
b
b
a
b
a
b
b
a
b
b
b
a
b
a
b
a
b
a
b
a
b