【问题标题】:c# MultiThread a function each file linec#MultiThread每个文件行一个函数
【发布时间】:2018-04-05 13:30:15
【问题描述】:

所以这看起来很混乱 但我基本上有一个类似的文件

username:password
username1:password4
username14:password114

现在我也有一个看起来像这样的函数/void

  public static void Login(string user, string pass)

现在 void 所做的就是发出一个 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();        
}

但问题在于它一直在悲伤地检查同一个帐户

你们知道有什么解决办法吗?

【问题讨论】:

  • 你为什么用AccountList[accountline]而不是line
  • @TheGeneral 这不是很有帮助。 KirriDev,注意 acountline++ 发生在任务中
  • @TheGeneral 我正在尝试为某些游戏制作每日自动登录功能,不包括暴力破解
  • tocheck.Split(':') 可以提取到局部变量中,以获得更高的性能
  • @FrankM 谢谢,我会把它放在一条线上,但这不是我要在这里解决的基本问题:(

标签: c# multithreading indexing


【解决方案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);
});

【讨论】:

  • 我可能是错的,但您不应该在局部变量中捕获行,然后再将其传递给闭包吗?
  • @DarkSquirrel42 如果您要使用普通的 for 循环,那么是的,您需要这样做,否则您会遇到超出范围的情况,因为循环的索引变量将具有超出范围的值由于关闭的集合。但是 foreach 让这些东西成为可能
  • @KirriDev 我做了一个编辑,看看。您确定您的收藏中没有任何重复条目吗?=!
  • @KirriDev 你也可以使用Parallel.ForEach 它是为像你这样的场景而构建的。我发布了一个例子
  • @KirriDev 如果我的回答帮助您解决了问题,您可以考虑将其标记为已接受。如果您不知道该怎么做,this post 可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
相关资源
最近更新 更多