所以这看起来很混乱 但我基本上有一个像
这样的文件username:password
username1:password4
username14:password114
现在我还有一个看起来像这样的函数/ void
public static void Login(string user, string pass)
现在虚空所做的就是制作一个httprequest并返回它,
if (reqCookie.Equals("Error1"))
{
//whenever the login credentials are false
}
else if (reqCookie.Equals("proxy"))
{
//Whenever a captcha error get's returned it sets a proxy here
}
else
{
//Whenever the request is successfull
}
我试过了:
foreach (var line in AccountList)
{
new Task(() => {
Console.WriteLine("LINE = " + accountline);
string tocheck = AccountList[accountline];
username = tocheck.Split(':')[0];
password = tocheck.Split(':')[1];
Login(username, password);
accountline++;
}).Start();
}
但问题在于它继续遗憾地检查同一个帐户
你们知道任何解决方案吗?
答案 0 :(得分:1)
这是一个运气问题,或者任务实际开始的速度有多快。基本上,如果所有任务同时到达此行:
string tocheck = AccountList[accountline];
然后变量accountline
没有递增一次并且每个任务具有相同的值。这就是你有时得到这个结果的原因:
但问题在于它继续遗憾地检查同一个帐户
您应该使用line
并忘记索引变量。这样每个任务都可以获得它的个人价值。此外,您只能Split
一次,然后分发返回数组中的值
foreach (var line in AccountList)
{
new Task(() =>
{
string [] temp = line.Split(':');
username = temp[0];
password = temp[1];
Login(username, password);
}).Start();
}
这种方式有效,但有时仍会使用相同的用户名并传递...
那么你可能应该从Task方法中取出字符串处理:
foreach (var line in AccountList)
{
string [] temp = line.Split(':');
username = temp[0];
password = temp[1];
Task.Run(() => Login(username, password));
}
您也可以使用Parallel.ForEach来完成您想要的任务:
Parallel.ForEach(AccountList, line =>
{
string [] temp = line.Split(':');
username = temp[0];
password = temp[1];
Login(username, password);
});