我有一个控制台应用程序,我需要访问一些网址200次,等待所有请求返回并处理200个结果.
我这样做,并行:
var classNameTasks = Enumerable.Range(1, 200).Select(i => webApi.getSplittedClassName()).ToArray();
string[][] splittedClassNames = await Task.WhenAll(classNameTasks);
if (splittedClassNames[0] == null)
result = new TextResult("Error accessing the web");
getSplittedClassName返回一个字符串[],如果互联网关闭,它将返回null.
现在,正如您所看到的,在完成所有任务后,我会检查内容,如果其为null – >互联网问题.
这里的问题是我需要等待整个200个请求返回才能检查内容.
我正在寻找一种方法来立即检测没有互联网的情况,并且我返回null,而不必等待200个请求.
最佳答案 要做到这一点,你需要
> CancellationTokenSource表示作业已完成.
> Tortuga.Anchor的WhenAll方法
static async Task Test()
{
TextResult result;
var cts = new CancellationTokenSource();
var classNameTasks = Enumerable.Range(1, 200).Select(i => getSplittedClassName(cts)).ToArray();
await classNameTasks.WhenAll(cts.Token);
if (cts.IsCancellationRequested)
result = new TextResult("Error accessing the web");
string[][] splittedClassNames = classNameTasks.Select(t => t.Result).ToArray();
}
private static async Task<string[]> getSplittedClassName(CancellationTokenSource cts)
{
try
{
//real code goes here
await Task.Delay(1000, cts.Token); //the token would be passed to the real web method
return new string[0];
}
catch
{
cts.Cancel(); //stop trying
return null;
}
}