我有这个简单的方法:
static void Extract()
{
Interlocked.Add(ref Program.n, 1);
Console.WriteLine("Currently on: " + n + " Page");
Console.WriteLine("Downloading String...Extract...");
WebClient client = new WebClient();
string html = client.DownloadString("www.something.com&page=" + n);
Console.WriteLine("Proccesing data from string... (Extract)");
}
我想一次调用方法Extract()
几次,我尝试了这个:
while(n<3411)
{
var tasks = new List<Task>();
for (int x = 0; x < 7; x++)
{
tasks.Add(Task.Factory.StartNew(new Action(Extract)));
}
Task.WaitAll(tasks);
}
但我收到错误
严重级代码描述项目文件行抑制状态 错误CS1503参数1:无法转换 &#39; System.Collections.Generic.List&#39;至 &#39; System.Threading.Tasks.Task&#39; RecipeCommunity_Users C:\ Users \ xxx \ AppData \ Local \ Temporary Projects \ Community_Users \ Program.cs 24 Active
如何一次多次调用方法Extract()
?
答案 0 :(得分:10)
你需要的只是
Task.WaitAll(tasks.ToArray());
与WhenAll不同,它不接受IEnumerable<Task>
。
https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx
你的另一个选择可能是
await Task.WhenAll(tasks);
答案 1 :(得分:8)
Task.WaitAll
方法的签名是:
public static void WaitAll(params Task[] tasks);
它收到Task[]
而不是列表。改为:
Task.WaitAll(tasks.ToArray());
根据使用情况,使用WhenAll
作为L.B在他的回答中说明可能更好。然后用这种方式:
await Task.WhenAll(tasks);
请参阅此问题:WaitAll vs WhenAll。简而言之,WaitAll
阻止线程,WhenAll
本身不会。
正如Eser在评论中所指出的那样,使用Task.WhenAll(tasks).Result
会阻止线程,但这是因为阻止了WhenAll
返回的任务