【发布时间】:2023-04-05 09:40:01
【问题描述】:
我有这个检查代理服务器的功能,目前它只检查一些线程并等待所有线程完成,直到下一组开始。是否可以在一个线程从允许的最大值完成后立即启动一个新线程?
for (int i = 0; i < listProxies.Count(); i+=nThreadsNum)
{
for (nCurrentThread = 0; nCurrentThread < nThreadsNum; nCurrentThread++)
{
if (nCurrentThread < nThreadsNum)
{
string strProxyIP = listProxies[i + nCurrentThread].sIPAddress;
int nPort = listProxies[i + nCurrentThread].nPort;
tasks.Add(Task.Factory.StartNew<ProxyAddress>(() => CheckProxyServer(strProxyIP, nPort, nCurrentThread)));
}
}
Task.WaitAll(tasks.ToArray());
foreach (var tsk in tasks)
{
ProxyAddress result = tsk.Result;
UpdateProxyDBRecord(result.sIPAddress, result.bOnlineStatus);
}
tasks.Clear();
}
【问题讨论】:
-
this 是您要找的吗?
-
也许您正在寻找 ThreadPool:docs.microsoft.com/en-us/dotnet/api/… 或 Parallel.ForEach:docs.microsoft.com/en-us/dotnet/api/…
-
@EJoshuaS 不是真的,因为延续任务/链继续其父级的结果,我不需要将结果从一个线程传递到另一个
-
您没有正确使用任务。 “检查代理”受 I/O 限制。您可能不需要超过 1 个线程来同时驱动所有线程。您不需要多线程或使用任务并行库(用于 CPU 绑定操作)接受的答案。不要执行Task.Result,阅读async best practices 并选择BionicCode's answer 中的一个更好的选项。
标签: c# .net multithreading