как перебрать каждую строку данных, чтобы выполнить функцию одну за другой для каждой строки - PullRequest
0 голосов
/ 25 августа 2018

У меня есть таблица в базе данных с одним столбцом и несколькими строками.Что я делаю, так это перебираю каждую строку этой таблицы и вызываю функцию для отправки почты для каждой строки.Но проблема в том, что функция выполняется для всех строк одновременно, тогда как я хочу выполнить ее по одной для каждой строки.Вот код -

 protected void btnSubmit_Click(object sender, EventArgs e)
        {

            GetAllRecipient();
            Msg = null;
            ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Email sent.');", true);

        }
     public void SendHTMLMail(string emailAddress)
            {
                MailMessage Msg = new MailMessage();
                SmtpClient smtp = new SmtpClient();
                Msg.To.Add(emailAddress);

           StreamReader reader = new StreamReader(Server.MapPath("~/one.html"));
                string readFile = reader.ReadToEnd();
                Regex regx = new Regex("(?<!src=\")http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*([a-zA-Z0-9\\?\\#\\=\\/]){1})?", RegexOptions.IgnoreCase);
                string output = regx.ToString();
                output = readFile;
                Msg.Body = output.ToString();
                Msg.IsBodyHtml = true;
                int i = 0;
                string username = Server.UrlEncode(this.txtUsername.Text);
                output = regx.Replace(output, new MatchEvaluator((match) =>
                {

                    var url = Uri.EscapeDataString(match.Value.ToString());
                    url = url.Replace("%3F", "&").Replace("%3D", "=");
                    return $"http://10.10.10.12/MI/two?sender={username}&link={url}&mailer_id={i}";
                }));
                Msg.From = new MailAddress(txtUsername.Text);
                Msg.Subject = null;
                smtp.Host = "smtp.gmail.com";
                smtp.Port = 587;
                smtp.UseDefaultCredentials = false;
                smtp.Credentials = new System.Net.NetworkCredential(txtUsername.Text, txtpwd.Text);
                smtp.EnableSsl = true;
                smtp.Send(Msg);
            }
            public void GetAllRecipient()
            {
                if (RadioButton1.Checked)
                {

                    SqlCommand cmd = new SqlCommand();
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "SELECT address FROM address1";
                    cmd.Connection = sql;
                    DataTable dt = new DataTable();
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    sql.Open();
                    da.Fill(dt);
                    sql.Close();

                     //   for (int a = 0; a < dt.Rows.Count; a++)
                      //  {
                        foreach (DataRow row in dt.Rows)

                            {
                                SendHTMLMail(row["address"].ToString());

                            }

                       // }
                }

                else if (RadioButton2.Checked)
                {
                    string connectionString = "";
                    if (FileUpload1.HasFile)
                    {
                        string fileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
                        string fileExtension = Path.GetExtension(FileUpload1.PostedFile.FileName);
                        string fileLocation = Server.MapPath("~/App_Data/" + fileName);
                        FileUpload1.SaveAs(fileLocation);

                        if (fileExtension == ".xls")
                        {

                            connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
                        }
                        else if (fileExtension == ".xlsx")
                        {
                            connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
                        }
                        OleDbConnection con = new OleDbConnection(connectionString);
                        OleDbCommand cmd = new OleDbCommand();
                        cmd.CommandType = System.Data.CommandType.Text;
                        cmd.Connection = con;
                        OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
                        DataTable dt = new DataTable();
                        con.Open();
                        DataTable dtExcelSheetName = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        string getExcelSheetName = dtExcelSheetName.Rows[0]["Table_Name"].ToString();
                        cmd.CommandText = "SELECT address FROM [" + getExcelSheetName + "]";
                        dAdapter.SelectCommand = cmd;
                        dAdapter.Fill(dt);
                        con.Close();


                      //  for (int a = 0; a < dt.Rows.Count; a++)
                       // {
                            foreach (DataRow row in dt.Rows)
                            {
                                SendHTMLMail(row["address"].ToString());

                            }

                      //  }
                    }
                }

1 Ответ

0 голосов
/ 25 августа 2018

В вашем коде нет ничего, что демонстрирует параллелизм или параллелизм. В существующем состоянии он должен выполнять SendHTMLMail последовательно для каждой строки, а не одновременно. Что заставляет вас чувствовать, что все это происходит одновременно? Также убедитесь, что реализация SendHTMLMail не является асинхронной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...