mar*_*lof 1 c# multithreading task
我有这个简单的方法:
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)");
}
Run Code Online (Sandbox Code Playgroud)
我想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);
}
Run Code Online (Sandbox Code Playgroud)
但我得到错误
严重级代码描述项目文件行抑制状态错误CS1503参数1:无法从'System.Collections.Generic.List'转换为'System.Threading.Tasks.Task'RecipeCommunity_Users C:\ Users\xxx\AppData\Local\Temporary Projects\Community_Users\Program.cs 24有效
我如何Extract()一次多次调用方法?
L.B*_*L.B 10
所有你需要的是
Task.WaitAll(tasks.ToArray());
Run Code Online (Sandbox Code Playgroud)
与WhenAll不同,它不接受IEnumerable<Task>.
https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx
你的另一个选择可能是
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
该Task.WaitAll方法的签名是:
public static void WaitAll(params Task[] tasks);
Run Code Online (Sandbox Code Playgroud)
它接收一个Task[]而不是一个列表.改成:
Task.WaitAll(tasks.ToArray());
Run Code Online (Sandbox Code Playgroud)
根据使用情况,最好使用WhenAll他在答案中说明的LB. 然后使用这种方式:
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
看到这个问题:WaitAll vs WhenAll.简而言之,WaitAll阻止线程,而WhenAll不是.
正如Eser在评论中所做的那样,使用Task.WhenAll(tasks).Result会阻塞线程,但这是因为阻止了WhenAll返回的任务