2017-01-14 3 views
0

私はこのアプリケーションをtabControlと、その他すべての必要なコントロールとともに持っています。電子メールを送信し、同時にアプリケーションを応答し続けるにはどうすればよいですか?

したがって、アプリケーションの主なタスクは電子メールを送信することです.1を送信すると、アプリケーションは2秒間応答しません。 しかし、私が10のように送信しようとすると、それは20秒間私のアプリケーションが応答しなくなります。あなたが想像しているように、これはとても良いことではありません。

私はスレッディングを試みてきましたが、所有するスレッドでUI操作を実行する必要があるというエラーが表示され続けます。

最初のListViewからtabControlの最初のTabから名前を取得していて、2番目のタブのボタンを押したときにその名前を使用しているので、苦労しているのは最後の3行ですそれらを3番目のタブに渡して、最終的に2番目のリストビューに入ります。

これは動作しますが、このプロセスを実行しているときにアプリケーションを「保留中」にして、スレッド処理を試みましたが、動作させることができませんでした。

この機能を適切にスレッド化するか、スレッド化しませんか?

using System; 
using System.Net; 
using System.Net.Mail; 
using System.Windows.Forms; 

namespace LearningTol 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnSend_Click(object sender, EventArgs e) 
     { 
      foreach(ListViewItem email in lvEmails.Items) 
      { 
       MailMessage msg = new MailMessage(); 
       msg.From = new MailAddress(tbUsername.Text); 
       msg.To.Add(new MailAddress(email.Text)); 
       msg.Subject = "Subject"; 
       msg.Body = tbMessage.Text; 
       msg.IsBodyHtml = false; 

       SmtpClient client = new SmtpClient(); 
       client.Host = "smtp.gmail.com"; 
       client.Port = 587; 
       client.Credentials = new NetworkCredential(tbUsername.Text, tbPassword.Text); 
       client.EnableSsl = true; 
       client.Send(msg); 

       ListViewItem lvi = new ListViewItem(email.Text); 
       lvi.SubItems.Add("Done!"); 
       lvFinishedEmails.Items.Add(lvi); 
      } 
     } 
    } 
} 

ここでは、「ビジュアル」参照があります。 enter image description here

答えて

4

良いアプローチは、ボタンのクリックハンドラasyncawait IOバインド仕事、この場合(代わりの同期Send方法)でSendAsyncメソッドを作ることであろう。これは、あなたのために正しいスレッドで再開するのにも役立ちます。さておき、あなたは通常async voidメソッドを持って返さないでしょう、あなたはいつものリターンTaskまたはTask<T>asyncを使用していただきたいが、イベントハンドラは、数の1であるため

private async void btnSend_Click(object sender, EventArgs e) 
{ 
    foreach(ListViewItem email in lvEmails.Items) 
    { 
     MailMessage msg = new MailMessage(); 
     msg.From = new MailAddress(tbUsername.Text); 
     msg.To.Add(new MailAddress(email.Text)); 
     msg.Subject = "Subject"; 
     msg.Body = tbMessage.Text; 
     msg.IsBodyHtml = false; 

     SmtpClient client = new SmtpClient(); 
     client.Host = "smtp.gmail.com"; 
     client.Port = 587; 
     client.Credentials = new NetworkCredential(tbUsername.Text, tbPassword.Text); 
     client.EnableSsl = true; 
     await client.SendMailAsync(msg); 

     ListViewItem lvi = new ListViewItem(email.Text); 
     lvi.SubItems.Add("Done!"); 
     lvFinishedEmails.Items.Add(lvi); 
    } 
} 

:だからあなたのコードは次のようになります。例外ケース。

+0

どこかで待っている必要はありませんか? – JonnyKhanas

+0

それは正しいです、 'await client.SendAsync(msg);を読む行を参照してください – Stuart

+0

私はそうです! – JonnyKhanas

関連する問題