【发布时间】:2018-07-25 02:31:52
【问题描述】:
我正在尝试做一个稳定的多线程系统(使用确切数量的线程集)
这是我实际使用的代码:
public void Start()
{
List<String> list = new List<String>(File.ReadAllLines("urls.txt"));
int maxThreads = 100;
var framework = new Sender();
ThreadPool.SetMinThreads(maxThreads, maxThreads);
Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = maxThreads }, delegate (string url)
{
framework.Send(url, "proxy:port");
});
Console.WriteLine("Done.");
}
它速度快且工作正常,但超过了 100 个线程限制,如果我使用的代理锁定到 100 个同时连接,则不会有问题,所以我的代理提供商取消了很多请求,任何想法如何在不超过限制的情况下保持线程速度?
谢谢。
【问题讨论】:
-
您确定问题不在于您的 Sender.Send 方法 - 它可能只是发送请求并立即返回,而不等待结果?
-
看起来你可能有一个类型-o。你不是要打电话给
ThreadPool.SetMaxThreads()看起来你正在设置最小值。 -
不,我确定它确实在等待结果,因为如果结果包含 X,它会写入控制台,@w4g3n3r:不,没有 SetMinThreads,Parallel.ForEach 慢得多,与 SetMaxThreads 相同.
-
@PeterWave 仅仅因为它写入控制台并不意味着它不会立即返回。做一个int,在framework.Send之前加一个,在framework.Send之后减去它。制作另一个 int,并存储第一个 int 的最大值。让我知道你得到了什么。 (使用 Interlocked.Increment)
-
@MineR 每个请求都会返回一个唯一的结果,它确实会等待结果,我很确定。
标签: c# multithreading task task-parallel-library parallel.foreach