首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >委托Begininvoke一次调用更多线程

委托Begininvoke一次调用更多线程
EN

Stack Overflow用户
提问于 2014-06-20 19:14:50
回答 1查看 188关注 0票数 0

我在写一个小的代理检查程序。我用这个来管理线程

代码语言:javascript
复制
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“函数:

代码语言:javascript
复制
private void CheckProxyAsync(Proxy p)
{
    InvokeDelegate.BeginInvoke(p, Callback, null);
}

这是我的回音:

代码语言:javascript
复制
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();

}

正如您在manager函数中看到的那样,我将正在运行的线程计数打印到控制台。计数将在委托"CheckProxy“所属的函数"InvokeDelegate”的开头和末尾更新。但是最大的并行运行异步方法是8,但我想要更多!我怎样才能提高限额?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-20 19:25:35

把这个留给线程池。几乎可以肯定的是,它比您更清楚线程的最佳数量。

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

如果您确实希望拥有更多的线程,则需要不使用线程池,而是显式地创建线程。但是,如果要这样做,您应该确实知道自己在做什么,并且知道为什么线程池的分配算法不适合您。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24334184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档