当后台工作线程运行时,定时器没有被调用



我有一个带有按钮的WPF窗口,该按钮生成一个BackgroundWorker线程来创建和发送电子邮件。当这个BackgroundWorker正在运行时,我想显示一个用户控件,该控件显示一些消息,后跟一个动画"…"。该动画由用户控件中的计时器运行。

即使我的邮件发送代码是在一个BackgroundWorker,定时器在用户控件从来没有被调用(好吧,它做,但只有当BackgroundWorker完成,这有点违背了目的…)。

WPF窗口相关代码:

private void button_Send_Click(object sender, RoutedEventArgs e)
{
    busyLabel.Show(); // this should start the animation timer inside the user control
    BackgroundWorker worker = new BackgroundWorker();
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerAsync();      
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
    this.Dispatcher.Invoke((Action)(() =>
    {      
        string body = textBox_Details.Text;
        body += "User-added addtional information:" + textBox_AdditionalInfo.Text; 
        var smtp = new SmtpClient
        {
            ...
        };
        using (var message = new MailMessage(fromAddress, toAddress)
        {
            Subject = subject,
            Body = body
        })
        {
            smtp.Send(message);
        }
    }));
}

用户控件("BusyLabel")中的相关代码:

public void Show()
{
    tb_Message.Text = Message;
    mTimer = new System.Timers.Timer();
    mTimer.Interval = Interval;
    mTimer.Elapsed += new ElapsedEventHandler(mTimer_Elapsed);
    mTimer.Start();
}
void mTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    this.Dispatcher.Invoke((Action)(() =>
    { 
        int numPeriods = tb_Message.Text.Count(f => f == '.');
        if (numPeriods >= NumPeriods)
        {
            tb_Message.Text = Message;
        }
        else
        {
            tb_Message.Text += '.';
        }         
    }));
}
public void Hide()
{
    mTimer.Stop();
}

你知道为什么它被锁住了吗?

在你的worker_DoWork方法中使用Dispatcher.Invoke是把执行放回UI线程,所以你并没有真正异步地做工作。

你应该能够删除它,基于你所显示的代码。

如果有结果值,你需要在工作完成后显示,把它放在DoWorkEventArgs,你将能够访问它(在UI线程)在worker_RunWorkerCompleted处理程序的事件参数。

使用BackgroundWorker的一个主要原因是编组是在幕后处理的,所以你不应该使用Dispatcher.Invoke

相关内容

  • 没有找到相关文章

最新更新