一次调用多个线程

本文关键字:线程 调用 一次 | 更新日期: 2023-09-27 18:09:31

我正在写一个小小的代理检查器。我用它来管理线程

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,但我想要更多!我怎样才能提高限额?

一次调用多个线程

把这个留给线程池。它几乎肯定比你更清楚线程的最佳数量是多少。

基本上,你的CPU一次只能执行这么多操作。创建超过一定数量的线程会增加大量的开销,其中内核会不断地交换当前应该执行的线程,同时不会增加额外的吞吐量。一旦达到这一点,添加线程将提高每个操作的响应性,并提高启动的速度,但代价是总吞吐量。

如果你真的想要更多的线程,你不需要使用线程池,而是显式地创建线程。但是如果你打算这样做,你应该真的确保你知道你在做什么,并且知道为什么线程池的分配算法不适合你。