c#MultiThread每个文件行的一个函数

时间:2018-04-05 13:30:15

标签: c# multithreading indexing

所以这看起来很混乱 但我基本上有一个像

这样的文件
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();        
}

但问题在于它继续遗憾地检查同一个帐户

你们知道任何解决方案吗?

1 个答案:

答案 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);
});