我正在尝试使用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));
}
答案 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以使程序保持运行。