-4
private void timer4_Tick(object sender, EventArgs e)
{
     se.SendPhotos(photofilesDir + "\\" + "photofiles.zip");

     if (se.photossendended == true)
     {
           se.photossendended = false;
           timer4.Enabled = false;
           timer5.Enabled = true;
     }
}

se.photossendended == trueそれが作り続けるまでse.SendPhotos(photofilesDir + "\\" + "photofiles.zip");

しかし、私はそれを一度だけ行い、se.photossendended真かどうかをチェックし続けたいと思っています。だから私はやろうとしたwhile(true)

private void timer4_Tick(object sender, EventArgs e)
{
     se.SendPhotos(photofilesDir + "\\" + "photofiles.zip");

     while(true)
     {
          if (se.photossendended == true)
          {
               se.photossendended = false;
               timer4.Enabled = false;
               timer5.Enabled = true;
          }
     }
}

しかし、それはすべてのプログラムを保持し、プログラムが続行されず、すべてがこのループでスタックしているため、true になることはありません。したがって、決して真実ではなく、ループは永遠に続きます。

編集**

これは se クラス SendEmail です

public void SendPhotos(string fileNameToSend) 
        {
            try
            {
                MailAddress from = new MailAddress("username", "User " + (char)0xD8 + " Name",
                System.Text.Encoding.UTF8);
                MailAddress to = new MailAddress("myrmail");
                photosmessage = new MailMessage(from, to);
                photosmessage.Body = "Please check the log file attachment i have some bugs.";
                string someArrows = new string(new char[] { '\u2190', '\u2191', '\u2192', '\u2193' });
                photosmessage.Body += Environment.NewLine + someArrows;
                photosmessage.BodyEncoding = System.Text.Encoding.UTF8;
                photosmessage.Subject = "Log File For Checking Bugs" + someArrows;
                photosmessage.SubjectEncoding = System.Text.Encoding.UTF8;
                Attachment myAttachment = new Attachment(fileNameToSend, MediaTypeNames.Application.Octet);
                photosmessage.Attachments.Add(myAttachment);
                SmtpClient photossend = new SmtpClient("smtp.gmail.com", 587);
                photossend.SendCompleted += new SendCompletedEventHandler(photossend_SendCompleted);
                photossend.EnableSsl = true;
                photossend.Timeout = 10000;
                photossend.DeliveryMethod = SmtpDeliveryMethod.Network;
                photossend.UseDefaultCredentials = false;
                photossend.Credentials = new NetworkCredential("user", "pass");
                string userState = "test message1";
                photossend.SendAsync(photosmessage, userState);
                SendLogFile.Enabled = false;
            }

            catch (Exception errors)
            {
                Logger.Write("Error sending message :" + errors);
            }
        }

        private void photossend_SendCompleted(object sender, AsyncCompletedEventArgs e)
        {
            photosmessage.Dispose();
            photossendended = true;
        }

メールが送信されたことを確認したかったので、それが真実であることを確認しました: photossendended = true; 次に、Timer4 tick イベントの Form1 で、タイマーが本当に停止し、タイマー 5 がアクティブになった場合にメールを 1 回送信してから、2 番目のメールを何度も送信します。

4 つのタイマー ティック イベントがあり、1 つずつ無効にして有効にします。その理由は、前のメールの送信が完了したときにのみ、各メールを送信したかったからです。

4

3 に答える 3

4

UI をブロックせずにメールを非同期に送信しようとしていると思いますが、次のメールに進む前に送信が完了するまで待ちたいと思います。

c#5/.Net 4.5 を使用SendMailAsyncしている場合は、asyncメソッドで次のように使用できます。

async void SendMails()
{
    await server.SendMailAsync(mailMessage1);
    await server.SendMailAsync(mailMessage2);
}

したがって、あなたの方法は次のようになります

public Task SendPhotos(string fileNameToSend)
{
    try
    {
        MailAddress from = new MailAddress("username", "User " + (char)0xD8 + " Name", System.Text.Encoding.UTF8);
        MailAddress to = new MailAddress("myrmail");
        var photosmessage = new MailMessage(from, to);
        photosmessage.Body = "Please check the log file attachment i have some bugs.";
        string someArrows = new string(new char[] { '\u2190', '\u2191', '\u2192', '\u2193' });
        photosmessage.Body += Environment.NewLine + someArrows;
        photosmessage.BodyEncoding = System.Text.Encoding.UTF8;
        photosmessage.Subject = "Log File For Checking Bugs" + someArrows;
        photosmessage.SubjectEncoding = System.Text.Encoding.UTF8;
        Attachment myAttachment = new Attachment(fileNameToSend, MediaTypeNames.Application.Octet);
        photosmessage.Attachments.Add(myAttachment);
        SmtpClient photossend = new SmtpClient("smtp.gmail.com", 587);
        photossend.EnableSsl = true;
        photossend.Timeout = 10000;
        photossend.DeliveryMethod = SmtpDeliveryMethod.Network;
        photossend.UseDefaultCredentials = false;
        photossend.Credentials = new NetworkCredential("user", "pass");
        SendLogFile.Enabled = false;
        return photossend.SendMailAsync(photosmessage);
    }
    catch (Exception errors)
    {
        Logger.Write("Error sending message :" + errors);
        return Task.FromResult<object>(null);
    }
}

そしてあなたはそれを使うことができます

await se.SendPhotos(photofilesDir1 + "\\" + "photofiles.zip");
await se.SendPhotos(photofilesDir2 + "\\" + "photofiles.zip");

PS:メソッドのより良い名前は次のようになりますSendPhotosAsync

于 2013-08-12T19:11:26.590 に答える
2
private void timer4_Tick(object sender, EventArgs e)
{
    if(!se.photossendended)
    {
        se.SendPhotos(photofilesDir + "\\" + "photofiles.zip");
        se.photossendended = true;
        timer4.Enabled = false;
        timer5.Enabled = true;
    }            
}

メールを非同期で送信したいようです。のコードはほぼ完了ですphotossend_SendCompleted。残りのコードは次のようになります。

bool sendingStarted;
private void timer4_Tick(object sender, EventArgs e)
{
     if(!sendingStarted) {
         se.SendPhotos(photofilesDir + "\\" + "photofiles.zip");
         sendingStarted = true;
     }
     if(photossended){
       timer4.Enabled = false;
       timer5.Enabled = true;   
    }            
}

次のようなことができるようSendCompletedに、クラスのイベントを公開する必要があると思います。SendEmail

se.SendCompleted += (s,e) => {
    timer4.Enabled = false;
    timer5.Enabled = true;//Of course we still need the flag sendingStarted.
};
于 2013-08-12T18:30:44.857 に答える
0

se.SendPhotos見た目はわかりませんが、このようにすることができます

private void timer4_Tick(object sender, EventArgs e)
{
     se.SendPhotos(photofilesDir + "\\" + "photofiles.zip");

     while(true)
     {
          if (se.photossendended == true)
          {
               se.photossendended = false;
               timer4.Enabled = false;
               timer5.Enabled = true;
               break;
          }
     }
}

しかし、これは解決策というよりハックです:/

于 2013-08-12T18:33:19.490 に答える