【问题标题】:Picture box Visibility does not change图片框可见性不变
【发布时间】:2018-12-12 13:51:55
【问题描述】:

我有一个 Windows 窗体应用程序,我在其中发送一个简单的电子邮件来测试 ID。问题是图片框的可见性属性没有改变。 谁能提出一个简单的解决方案?

我的按钮点击

private void BtnSend_Click(object sender, EventArgs e)
{
    try
    {
        pbLoad.Visible = true;
        sendemail();
        pbLoad.Visible = false;

        MessageBox.Show("Mail send");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

发送邮件功能

   public void sendemail()
    {
        SmtpClient client = new SmtpClient("smtp.gmail.com");
        client.Port = 587;
        client.EnableSsl = true;
        client.Timeout = 100000;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential(
          "myID@gmail.com", "mypassword");
        MailMessage msg = new MailMessage();
        msg.To.Add(txt_to.Text);
        msg.From = new MailAddress("myID@gmail.com");
        msg.Subject = txt_sub.Text;
        msg.Body = txt_msg.Text;

        //  Attachment data = new Attachment(txt_attach.Text);
        //     msg.Attachments.Add(data);
        // System.Threading.Thread.Sleep(2000);
        client.Send(msg);
    }
}

【问题讨论】:

  • pbLoad 是 gif 图片
  • 你要使用加载图片吗
  • 是的。实际上它是一个图片框内的动画加载 Gif 图像

标签: c# winforms


【解决方案1】:

因为你没有给主线程渲染它的机会。您的主线程正忙于发送邮件。您需要在另一个线程中发送邮件。首选Task.Run

使用Async/await 功能并调用SmtpClient.SendMailAsync,这不会阻塞调用线程。这样 UI 线程就有时间渲染图片框了。

你的方法应该是这样的:

private async void BtnSend_Click(object sender, EventArgs e)
{
    try
    {
        pbLoad.Visible = true;
        await SendEmailAsync();
        pbLoad.Visible = false;

        MessageBox.Show("Mail send");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

public Task SendEmailAsync()
{
    SmtpClient client = new SmtpClient("smtp.gmail.com");
    client.Port = 587;
    client.EnableSsl = true;
    client.Timeout = 100000;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.UseDefaultCredentials = false;
    client.Credentials = new NetworkCredential(
      "myID@gmail.com", "mypassword");
    MailMessage msg = new MailMessage();
    msg.To.Add(txt_to.Text);
    msg.From = new MailAddress("myID@gmail.com");
    msg.Subject = txt_sub.Text;
    msg.Body = txt_msg.Text;

    //  Attachment data = new Attachment(txt_attach.Text);
    //     msg.Attachments.Add(data);
    // System.Threading.Thread.Sleep(2000);
    return client.SendMailAsync(msg);
}

【讨论】:

  • 我是 Winforms 新手,您能多解释一下吗
  • @user3859356 您使用哪个版本的 .net?
  • 关于在 sendEmailSync 中写什么
  • 更新了我的答案,应该可以。在提供的链接中了解有关 async/await 的更多信息。
  • 谢谢。它真的有帮助.. 伟大而完美的答案
【解决方案2】:

使用线程概念

private void BtnSend_Click(object sender, EventArgs e)
    {

        try
        {
            pbLoad.Visible = true;

            Thread t=New Thread(sendemail);
            t.start();

         }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    public void sendemail()
        {
            SmtpClient client = new SmtpClient("smtp.gmail.com");
            client.Port = 587;
            client.EnableSsl = true;
            client.Timeout = 100000;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential(
              "myID@gmail.com", "mypassword");
            MailMessage msg = new MailMessage();
            msg.To.Add(txt_to.Text);
            msg.From = new MailAddress("myID@gmail.com");
            msg.Subject = txt_sub.Text;
            msg.Body = txt_msg.Text;

            //  Attachment data = new Attachment(txt_attach.Text);
            //     msg.Attachments.Add(data);
            // System.Threading.Thread.Sleep(2000);
            client.Send(msg);

           this.Invoke(new MethodInvoker(Finished))

        }
    }

Private Void Finished() 

{

 pbLoad.Visible = false;
 MessageBox.Show("Mail send");

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-10-13
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多