2012-03-07 12 views
0

@TitleSmtpClient.sendがメッセージを送信するのにかかった時間を調べる方法は?

メッセージの送信に要した時間はどのようにして決められますか?

「送信」をクリックすると、私のプログラムは単にサイレントになります。私はプログラムがメッセージを送信している間にロードされるプログレスバーのようなものを表示するようにしたいと思います。

これは可能ですか?瞬間のよう

、これは私が持っているものです。私は、「送信」をクリックすると

  try 
      { 
       MySqlDataAdapter adapter = new MySqlDataAdapter(); 
       MySqlCommand cmd = new MySqlCommand(getEmail, connect.connection); 
       cmd.Parameters.AddWithValue("@section", sectionSelect.SelectedValue); 

       adapter.SelectCommand = cmd; 

       System.Data.DataTable mailingList = new System.Data.DataTable(); 

       adapter.Fill(mailingList); 

       foreach (DataRow row in mailingList.Rows) 
       { 
        string rows = string.Format("{0}", row.ItemArray[0]); 
        message.To.Add(rows); 
       } 

       SmtpClient client = new SmtpClient(); 

       client.Credentials = new NetworkCredential(email, password.Password); 
       client.Host = "smtp.gmail.com"; 
       client.Port = 587; 
       client.EnableSsl = true; 

       client.Send(message); 
      } 
      catch (System.Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 

      finally 
      { 
       MessageBox.Show("Your message has been sent."); 
      } 
+0

'SmtpClient.Send'が中間ステータスを報告しないため、プログレスバーが無駄になります。 –

+0

あまりにも悪いです。私は、プログラムがメッセージを送信している間にユーザーが見ることができるものを求めていました。代わりに進捗バーを試しに関連付ける方法はありますか? TRYのすべての手続きが完了するまでロードしますか? – Nath

+0

もちろん。試してみる前にそれを表示し、最後に隠す。 –

答えて

0

今、私のプログラムは単純に沈黙しています。

SmtpClient.Send(MailMessage)は、非同期呼び出しではないため、操作が完了するまで呼び出しスレッドをブロックします。

SmtpClient.SendAsync(MailMessage, Object)でメッセージを送信すると、非同期でコールが発信され、送信が完了するまで任意の種類の待機ダイアログを表示できます。

これで、完了した操作をユーザーに報告するコールバック関数を設定できます。上にリンクされたMSDNの記事には、これの良い例があります。

0

このプロセスをUIスレッドで起動し、上記の方法の途中で(またはいくつかの点で)プログレスバーを更新できますが、これは理想的な方法ではありません。理想的には(各メッセージの所要時間や実際に送信したメッセージの数によって)作業プロセスを別のスレッドで起動したいと思うでしょう。

注:これは十分に長い実行プロセスでない場合、これは過剰です。

スレッディングを使用する簡単な方法は、BackgroundWorkerを使用することです。だから、これはあなたが以下のように使用すると、バックグラウンドスレッドでこれを起動することができ一括して複数のメッセージを送信するには、将来的に延長することができる十分に長い実行されている手順か何かであると仮定すると:

using System.Threading; 

    // Threading. 
    private BackgroundWorker bgWorker; 
    AutoResetEvent areProgressChanged = new AutoResetEvent(false); 

    private void SendYourMessage() 
    { 
     Stopwatch stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     try 
     { 
      MySqlDataAdapter adapter = new MySqlDataAdapter(); 
      MySqlCommand cmd = new MySqlCommand(getEmail, connect.connection); 
      cmd.Parameters.AddWithValue("@section", sectionSelect.SelectedValue); 
      adapter.SelectCommand = cmd; 

      // Show your progress. 
      (bgWorker as BackgroundWorker).ReportProgress(progressBarValue, "Half Way through..."); 

      DataTable mailingList = new DataTable(); 
      adapter.Fill(mailingList); 

      foreach (DataRow row in mailingList.Rows) 
      { 
       string rows = string.Format("{0}", row.ItemArray[0]); 
       message.To.Add(rows); 
      } 

      SmtpClient client = new SmtpClient(); 
      client.Credentials = new NetworkCredential(email, password.Password); 
      client.Host = "smtp.gmail.com"; 
      client.Port = 587; 
      client.EnableSsl = true; 
      client.Send(message); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      stopwatch.Stop(); 
      TimeSpan timeTaken = stopwatch.Elapsed; 
      MessageBox.Show(String.Format("Your message has been sent. That took {0}s", timeTaken.Seconds)); 
     } 
    } 

    private void SendMyMessage_Click(object sender, EventArgs e) 
    { 
     // Start job on new thread. 
     bgWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; 
     bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
     bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged); 
     bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); 
     bgWorker.RunWorkerAsync(); 
    } 

    void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker thisWorker = sender as BackgroundWorker; 
     SendYourMessage(); 
    } 

    void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     // Change progress bar (and form label). 
     this.progressBar.Value = e.ProgressPercentage; 
     this.label.Text = e.UserState; 

     // Tell the worker that the UIThread has been updated. 
     this.areProgressChanged.Set(); 
     return; 
    } 

    // Once the work is complete do something. 
    void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // Handle. 
     if (e.Cancelled || bgWorker.CancellationPending) 
      MessageBox.Show("Message cancelled at users request!"); 
     else if (e.Error != null) 
      MessageBox.Show(String.Format("Error: {0}.", e.Error.ToString())); 
     return; 
    } 

    // To cancel the job. 
    private void cancelAsyncButton_Click(System.Object sender, System.EventArgs e) 
    { 
     if (bgWorker.WorkerSupportsCancellation) 
      bgWorker.CancelAsync(); 
    } 

このコードは、微調整が必​​要な場合があります。基本的には、あなたのプロセス(ここではSomeEvent_Clickイベント)を起動するためのイベントを設定します。これはBackgroundgroundWorkerへのエントリポイントです。ここで使用するイベントの残りの部分はMSDNです。

幸運。

関連する問題