2

所以,这似乎是一个常见的问题,但我似乎无法找到一种方法来做到这一点。我有一个 C# Form 应用程序,它发送到 imap 客户端并处理电子邮件。我希望在表单上显示一个格式为“08:45”(8 分 45 秒)的计时器,让用户知道自他们单击按钮开始该过程以来已经过了多长时间。

一旦我的过程明显结束,我希望计时器停止。

private void btn_ImportEmail_Click(object sender, EventArgs e)
{
    this.timer = new System.Timers.Timer();
    this.lblTimer = new System.Windows.Forms.Label();
    ((System.ComponentModel.ISupportInitialize) (this.timer)).BeginInit();
    this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimerElapsed);

    //connect to email and download messages...

    this.timer.Enabled = true;
    this.timer.SynchronizingObject = this;
    timer.Interval = 1000;
    timer.Start();
    for (int I = 0 ; I <= messages.count() - 1; I++)
    {
        //process emails
    }
    timer.EndInit();
}

private void timer1_Tick(object sender, EventArgs e)
{
    lblTimer.Text = DateTime.Now.ToString("mm:ss");
}

private void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    lblTimer.Text = DateTime.Now.ToString("mm:ss");
   // lblTimer.Text = string.Format("{0:mm:ss}", DateTime.Now);
}
4

2 回答 2

0

以下 SO Q/A 可能会回答您的问题...

在标签中显示部分程序的运行时间

我建议根据您的需要更改格式。

于 2013-11-08T21:12:03.990 回答
0

我看到的第一件事是您正在使用 DateTime.Now 它将为您提供当前的分钟和秒,而不是经过的分钟和秒。第二件事也是主要的事情是,由于您正在主 UI 的线程中处理电子邮件,因此您会阻止标签被更新,因此您最好改用后台工作人员。

根据 Idle_Mind 的评论进行编辑,添加了 DateTime Object 而不是 counter

public partial class Form1 : Form
{
    BackgroundWorker bgw = new BackgroundWorker();
    Timer timer = new Timer();
    DateTime startTime;
    public Form1()
    {
        InitializeComponent();
        timer.Interval = 1000;
        timer.Tick += timer_Tick;
        bgw.DoWork += bgw_DoWork;
        bgw.RunWorkerCompleted+=bgw_RunWorkerCompleted;

    }

    void timer_Tick(object sender, EventArgs e)
    {

        label1.Text =((TimeSpan)DateTime.Now.Subtract(startTime)).ToString("mm\\:ss");

    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        timer.Stop();
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int I = 0 ; I <= messages.count() - 1; I++)
        {
            //process emails
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        bgw.RunWorkerAsync();
        startTime = DateTime.Now;
        timer.Start();
    }
}
于 2013-11-08T21:42:02.143 回答