一次多次调用相同的方法

时间:2016-10-11 20:37:23

标签: 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)");   
}

我想一次调用方法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()

2 个答案:

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