Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Parallel.ForEach-在ForEach中使用列表_C#_Multithreading_List_.net 4.0_Parallel.foreach - Fatal编程技术网

C# Parallel.ForEach-在ForEach中使用列表

C# Parallel.ForEach-在ForEach中使用列表,c#,multithreading,list,.net-4.0,parallel.foreach,C#,Multithreading,List,.net 4.0,Parallel.foreach,我对Parallel.ForEach感到困惑。 请您帮助我用Parallel.ForEach重写以下代码: #region Register private void btnStartRegister_Click(object sender, EventArgs e) { if (backgroundWorker2.IsBusy) { btnStartRegister.Enabled = false;

我对Parallel.ForEach感到困惑。
请您帮助我用Parallel.ForEach重写以下代码:

    #region Register

    private void btnStartRegister_Click(object sender, EventArgs e)
    {
        if (backgroundWorker2.IsBusy)
        {
            btnStartRegister.Enabled = false;
            lblStatusOfaccMValue.Text = "Canceling...";
            backgroundWorker2.CancelAsync();
        }
        else
        {
            txtLogInRegister.Text = string.Empty;
            btnStartRegister.Text = "Cancel";
            lblUserCreatedCountValue.Text = "---";
            lblStatusOfaccMValue.Text = "Running...";

            backgroundWorker2.RunWorkerAsync();
        }
    }

    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
        backgroundWorker2.ReportProgress(Convert.ToInt32(0));

        int UsersCount = int.Parse(txtUsersCount.Text);
        UsersCreatedCount_Step = 0;
        string path = Application.StartupPath;
        string accfilePath = path + @"\acc.txt";
        string logfilePath = path + @"\log.txt";
        string Ok_ip_port = string.Empty;
        string[] Separator = new string[] { "__" };
        int list_lines_acc_Current = -1;

        string[] lines_acc = File.ReadAllLines(accfilePath);
        List<string> list_lines_acc = new List<string>(lines_acc);
        List<string> list_lines_acc_new = new List<string>(list_lines_acc);

        foreach (string line_acc in list_lines_acc)
        {
            if (backgroundWorker2.CancellationPending)
            {
                e.Cancel = true;
                break;
            }

            list_lines_acc_Current++;
            string[] line_acc_ar = line_acc.Split(Separator, StringSplitOptions.None);
            if (line_acc_ar.Length == 3)
            {
                string username = line_acc_ar[0];
                string password = line_acc_ar[1];
                string email = line_acc_ar[2];
                string[] email_ar = email.Split('@');
                email = email_ar[0] + "%40" + email_ar[1];


                list_lines_acc_new[list_lines_acc_Current] += "__" + txtSuffixURL.Text + "__" + txtServerNumber.Text + "__" + "127.0.0.1:2222";

                try
                {
                    bool[] RegisterMethod_res = RegisterMethod(bla bla bla);
                    bool failed = RegisterMethod_res[0];
                    bool world_full = RegisterMethod_res[1];
                    if (!failed)
                    {
                        UsersCreatedCount_Step++;
                        backgroundWorker2.ReportProgress(Convert.ToInt32(UsersCreatedCount_Step * (100.0 / UsersCount)));
                        list_lines_acc_new[list_lines_acc_Current] += "__" + "Y";
                    }
                    else
                    {
                        if (world_full)
                        {
                            list_lines_acc_new[list_lines_acc_Current] += "__" + "N";
                            e.Cancel = true;
                            break;
                        }
                        else
                        {
                            list_lines_acc_new[list_lines_acc_Current] += "__" + "N";
                        }
                    }

                    File.WriteAllLines(accfilePath, list_lines_acc_new.ToArray());
                }
                catch (Exception ex)
                {
                    list_lines_acc_new[list_lines_acc_Current] += "__" + "N";

                    File.WriteAllLines(accfilePath, list_lines_acc_new.ToArray());
                }

                if (UsersCount == UsersCreatedCount_Step)
                {
                    break;
                }
            }
        }

        File.WriteAllLines(accfilePath, list_lines_acc_new.ToArray());
    }

    private bool[] RegisterMethod()
    {
        bla bla bla
        ...
        ...
        return RegisterMethod_res;
    }

    private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar2.Value = e.ProgressPercentage;
        lblUserCreatedCountValue.Text = UsersCreatedCount_Step.ToString();
    }

    private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        btnStartRegister.Text = "Start Register";
        btnStartRegister.Enabled = true;

        if (e.Error != null)
        {
            MessageBox.Show(e.Error.Message);
            return;
        }
        if (e.Cancelled)
        {
            lblStatusOfaccMValue.Text = "Cancelled...";
        }
        else
        {
            lblStatusOfaccMValue.Text = "Completed";
        }
    }

    #endregion
        if (UsersCount == UsersCreatedCount_Step)
        {
            break;
        }
在那种情况下,我想停止那样做。
但是我不知道
UsersCreatedCount\u Step
如何在并行模式下工作

        if (UsersCount == UsersCreatedCount_Step)
        {
            break;
        }
非常感谢您的帮助

        if (UsersCount == UsersCreatedCount_Step)
        {
            break;
        }

提前谢谢

我不确定这样做是否安全。这里有很多问题,包括您试图从多个线程写入同一个文件:

        if (UsersCount == UsersCreatedCount_Step)
        {
            break;
        }
File.WriteAllLines(accfilePath, list_lines_acc_new.ToArray());

这部分不仅需要锁,而且如果你有一个机械磁盘,性能也会下降。

我不确定它是否能安全完成。这里有很多问题,包括您试图从多个线程写入同一个文件:

        if (UsersCount == UsersCreatedCount_Step)
        {
            break;
        }
File.WriteAllLines(accfilePath, list_lines_acc_new.ToArray());

该部分不仅需要一个锁,而且如果你有一个机械磁盘,性能也会下降。

请只向我们展示你有
foreach
的方法,而不是整个类。但我认为其他部分是必要的。我想告诉你,我正在使用backgroundworker,那么我如何才能停止这种并行。foreach在点击取消按钮后。Tudor是对的,关注这个问题。这几乎是不可读的。和往常一样:描述“在并行模式下它们存在问题”。什么问题?如果你想知道“如何停止Parallel.ForEach()”,然后问这个问题,大约5行代码。请只告诉我们你有
ForEach
的方法,而不是整个类。但我认为其他部分是必要的。我想告诉你,我正在使用backgroundworker,那么我如何才能停止这种并行。foreach在点击取消按钮后。Tudor是对的,关注这个问题。这几乎是不可读的。和往常一样:描述“在并行模式下它们存在问题”。什么问题?如果你想知道“如何停止Parallel.ForEach()”,然后问这个问题,大约5行代码。那么你的建议是什么?(感谢您的编辑和回答)@MoonLight:我的建议是,如果您在这种情况下真的需要并行性,那么首先考虑一下,因为正确地执行它似乎很麻烦。你真的需要这个代码更快吗?实际上它不需要锁。但它会覆盖
AppendAllLines()
可以。有没有办法调试Parallel.ForEach?(对于常规调试,我们无法理解任何内容)。还有一种方法可以强制Parallel.ForEach每次使用2个线程,而不是更多。意思是我希望索引1和2一起使用。之后索引3和4一起继续。但是如果没有这些,我们就有一些随机索引,因此我们无法控制parallel.ForEach。那么你的建议是什么?(感谢您的编辑和回答)@MoonLight:我的建议是,如果您在这种情况下真的需要并行性,那么首先考虑一下,因为正确地执行它似乎很麻烦。你真的需要这个代码更快吗?实际上它不需要锁。但它会覆盖
AppendAllLines()
可以。有没有办法调试Parallel.ForEach?(对于常规调试,我们无法理解任何内容)。还有一种方法可以强制Parallel.ForEach每次使用2个线程,而不是更多。意思是我希望索引1和2一起使用。之后索引3和4一起继续。但是没有它,我们就有一些随机索引在一起,因此我们无法控制parallel.ForEach。
        if (UsersCount == UsersCreatedCount_Step)
        {
            break;
        }