如何生成 10 个线程来处理字典?
How do I spawn 10 threads to process a Dictionary?
我有一个用户名字典,我想检查这些用户是否可以用于登录网站,但是一个一个地迭代它会持续很长时间,因为它是一个巨大的列表,我希望它 运行 在最多 10 个线程中,一次测试 10 个。
Dictionary<string, string> test = new Dictionary<string,string>;
test.Add("user1", "pass1");
test.Add("user2", "pass2");
...
test.Add("user999", "pass999");
如何生成 10 个线程并对其进行处理,然后将所有结果合并到一个新的字典中,该字典仅包含通过登录测试的用户?站点示例(非真实站点,仅用于演示此功能return true 为成功登录,false 为错误登录)。
private bool IsLoginSuccess(string u, string p)
{
WebClient wc = new WebClient();
string str = wc.DownloadString("http://www.samplesite.com?user=" + u + "&pass=" p);
if (str == "1") return true;
return false;
}
首先,如果您希望对单个站点使用大量连接,您可能需要调整进程配置以允许这样做 - 否则您会发现 WebClient
.请参阅 <connectionManagement>
app.config element。
最简单的方法可能是使用 ConcurrentDictionary
来收集结果,并使用 Parallel.ForEach
在多个线程中处理原始字典。 (从多个线程 读取 字典是安全的,只要没有任何内容写入它。)
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(test,
new ParallelOptions { MaxDegreeOfParallelism = 10 },
pair =>
{
if (IsLoginSuccess(pair.Key, pair.Value))]
{
results[pair.Key] = pair.Value;
}
});
或者,您可以使用异步请求完成所有操作 - 请注意,使用 C# 5 比使用 C# 4 更容易。
我有一个用户名字典,我想检查这些用户是否可以用于登录网站,但是一个一个地迭代它会持续很长时间,因为它是一个巨大的列表,我希望它 运行 在最多 10 个线程中,一次测试 10 个。
Dictionary<string, string> test = new Dictionary<string,string>;
test.Add("user1", "pass1");
test.Add("user2", "pass2");
...
test.Add("user999", "pass999");
如何生成 10 个线程并对其进行处理,然后将所有结果合并到一个新的字典中,该字典仅包含通过登录测试的用户?站点示例(非真实站点,仅用于演示此功能return true 为成功登录,false 为错误登录)。
private bool IsLoginSuccess(string u, string p)
{
WebClient wc = new WebClient();
string str = wc.DownloadString("http://www.samplesite.com?user=" + u + "&pass=" p);
if (str == "1") return true;
return false;
}
首先,如果您希望对单个站点使用大量连接,您可能需要调整进程配置以允许这样做 - 否则您会发现 WebClient
.请参阅 <connectionManagement>
app.config element。
最简单的方法可能是使用 ConcurrentDictionary
来收集结果,并使用 Parallel.ForEach
在多个线程中处理原始字典。 (从多个线程 读取 字典是安全的,只要没有任何内容写入它。)
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(test,
new ParallelOptions { MaxDegreeOfParallelism = 10 },
pair =>
{
if (IsLoginSuccess(pair.Key, pair.Value))]
{
results[pair.Key] = pair.Value;
}
});
或者,您可以使用异步请求完成所有操作 - 请注意,使用 C# 5 比使用 C# 4 更容易。