在多线程 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.";
}
我已经尝试了几种带有计时器的解决方案(尝试了所有三个计时器 类)并且 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.";
}