0

我正在尝试使用 开始一个新任务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));
}
4

2 回答 2

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);
    }

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

顺便说一句,我建议你使用大写字母作为函数名,意思是:ConnectUser而不是connectUser.

于 2013-05-28T00:00:00.883 回答
0

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

于 2013-05-28T00:16:08.460 回答