一次多次调用相同的方法

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)


Gil*_*een 8

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返回的任务

  • `简而言之,WaitAll会阻塞线程而WhenAll不会```WhenAll`也可以阻止当前线程.`Task.WhenAll(tasks).Result`这与你如何使用这些工具有关 (2认同)