在多线程 C# WIndows Forms 应用程序中显示倒计时

Displaying countdown in multi threaded C# WIndows Forms app

我已经尝试了几种带有计时器的解决方案(尝试了所有三个计时器 类)并且 none 在该特定位置触发了 Tick(elapsed) 事件。我有一个多线程 WinForms 应用程序。 我需要的东西看起来很简单,但我花了好几天时间准备认输。

我需要在执行操作时以秒为单位在弹出窗口中显示实时倒计时。如果 90 秒过去了但没有取得任何结果(我有一个标志),显示警告,所以我肯定需要更新 UI 线程。

我研究了三个不同的计时器 类 和 none 在那个特定的地方为我工作 - 它们的流逝或滴答事件不会触发。我想这是因为我已经有另一个线程正在轮询串行端口,因为如果我创建一个虚拟按钮并将计时器绑定到 Click 事件,就可以了。请注意,我不需要定时器在串行端口轮询中启动,功能是完全独立的。

有人可以提出在这种情况下可能有效的解决方案吗?

类 我试过是

 Windows.Forms.Timer
    System.Timers.Timer
    System.Threading.Timer

此答案假定 "Popup" 不会阻塞主 UI 线程。

为您的 "Popup" 创建新的 MIDI 子表单,如果您希望它存在于父表单的范围内,否则这工作正常。

代码取自 Alex 在此处提供的非常有用的答案:How to use a BackgroundWorker?

public Popup()
{
    InitializeComponent();

    backgroundWorker1.DoWork += backgroundWorker1_DoWork;
    backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
    backgroundWorker1.WorkerReportsProgress = true;
}

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(1000);
        backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
    if(progressBar1.Value == 90) 
        WarningLbl.Text = "WARNING: Process is taking too long to complete.";
}