Task.Factory.StartNew没有做任何事情

时间:2013-05-27 23:57:52

标签: c# task-parallel-library

我正在尝试使用Task.Factory启动一个新任务,但它什么都不做,因为它只是移动到下一行代码并且不执行任何任务。这是代码:

for(int i = 0; i < alts.Length; i++) {
    String password = alts [i].Substring (alts[i].IndexOf(":")+1);
    String username = alts [i].Substring (0,alts[i].IndexOf(":"));

    Console.WriteLine ("Loaded account: "+ username);
    Task.Factory.StartNew(() => connectUser(username, password, server));
}

2 个答案:

答案 0 :(得分:1)

您应该使用await关键字等待任务完成。只需将await放在行的开头:

Task.Factory.StartNew(() => connectUser(username, password, server));

此外,您必须在函数的返回类型之前添加async关键字。

更新(更多信息): Task.Factory.StartNew创建一个任务,启动它并将其返回给您。如果您不使用await,则不要等待它完成。这有助于您想要启动一系列任务并让它们同时运行的情况。

    private static void connectUser(string username, string password, string server)
    {
        while (true)
        {
            Console.WriteLine("Connecting... " + username);
            Thread.Sleep(500);
        }
    }

    static void Main(string[] args)
    {
        var server = "a.com";
        var alts = new string[] { "abc:abc", "bcd:bcd" };

        var tasks = new Task[alts.Length];

        for (int i = 0; i < alts.Length; i++)
        {
            String password = alts[i].Substring(alts[i].IndexOf(":") + 1);
            String username = alts[i].Substring(0, alts[i].IndexOf(":"));

            Console.WriteLine("Loaded account: " + username);
            tasks[i] = Task.Factory.StartNew(() => connectUser(username, password, server));
        }

        Task.WaitAll(tasks);
    }

这是我之前建议的。您创建一个Task的数组,并将Task.Factory.StartNew()的结果放入该数组中。然后使用Task.WaitAll()函数等待任务完成。另一种方法是使用线程。

顺便说一下,我建议您使用大写字母表示函数名称,这意味着:ConnectUser而不是connectUser

答案 1 :(得分:0)

从您的评论中,问题是任务是在作为后台线程的线程池线程上运行的。只有前台线程使进程保持运行,因此一旦Main退出程序结束。您可能最好只手动创建线程并将IsBackground设置为false以使程序保持运行。