我正在写一个小代理检查程序。我用它来管理线程
que = new Queue<Proxy>(_settings.Proxies);
while (que.Count > 0)
{
lock (que)
{
while (running >= _settings.Threads) {}
Proxy cProxy = que.Dequeue();
CheckProxyAsync(cProxy);
Console.WriteLine(running);
}
}
我认为使用带回调的异步方法来管理它是个好主意!
这是“CheckProxyAsync”功能:
private void CheckProxyAsync(Proxy p)
{
InvokeDelegate.BeginInvoke(p, Callback, null);
}
这是我的回调:
private void Callback(IAsyncResult ar)
{
var returnTuple = InvokeDelegate.EndInvoke(ar);
if (!returnTuple.Item1) //if failed
{
if (!_settings.Retry || returnTuple.Item2.Retries > _settings.RetryCount) //if no retry or retry count is reached
_settings.Proxies.Remove(returnTuple.Item2); //Dead proxy :(
else que.Enqueue(returnTuple.Item2); //try again
}
else //if success
{
Interlocked.Increment(ref filteredProxies);
Interlocked.Decrement(ref leftProxies);
if (returnTuple.Item2.ProxyAnonymity == Anonymity.L1)
Interlocked.Increment(ref l1Proxies);
else if (returnTuple.Item2.ProxyAnonymity == Anonymity.L2)
Interlocked.Increment(ref l2Proxies);
else if (returnTuple.Item2.ProxyAnonymity == Anonymity.L3)
Interlocked.Increment(ref l3Proxies);
}
OnUpdate();
}
正如您在管理器功能中看到的,我将正在运行的线程计数打印到控制台。计数在委托“InvokeDelegate”所属的函数“CheckProxy”的开头和结尾处得到更新。 但最大并行运行异步方法是8,但我想要更多! 我怎样才能增加限额?
答案 0 :(得分:1)
将其留给线程池。它几乎肯定比你更了解最佳线程数。
从根本上说,您的CPU只能同时执行如此多的操作。创建超过一定数量的线程会增加大量开销,其中核心不断地交换当前正在执行哪个线程,而不添加额外的吞吐量。一旦达到这一点,添加线程将增加每个操作的响应速度,并提高启动的速度,但代价是总吞吐量。
如果确实希望拥有更多的线程,那么您将不需要使用线程池而是明确地创建线程。但是,如果您要这样做,您应该确实确保您知道自己在做什么,并且知道为什么线程池的分配算法不是&#39非常适合你。