3 回答

TA贡献1829条经验 获得超13个赞
您可以像下面这样更改您的代码,它会正常工作。
将 perbaharuiStimulus 代码更改为
lbStimulus.Text = stimulus;
更改WorkerReportsProgress为True
更改backgroundWorker1_DoWork以下
Stimulus stimulus = new Stimulus();
Stopwatch watch = new Stopwatch();
backgroundWorker1.ReportProgress(1, stimulus);
watch.Start();
do
{
} while (watch.Elapsed.Seconds != 2);
watch.Restart();
backgroundWorker1.ReportProgress(2, stimulus);
do
{
} while (watch.Elapsed.Seconds != 6);
watch.Restart();
backgroundWorker1.ReportProgress(3, stimulus);
do
{
} while (watch.Elapsed.Seconds != 2);
watch.Stop();
stimulus.Invoke((MethodInvoker)delegate { stimulus.Close(); });
添加backgroundWorker1_ProgressChanged事件并将以下代码放入其中
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Stimulus stimulus = ( Stimulus)e.UserState;
if(e.ProgressPercentage==1)
stimulus.perbaharuiStimulus("+");
if (e.ProgressPercentage == 2)
stimulus.perbaharuiStimulus("MAJU");
if (e.ProgressPercentage == 3)
stimulus.perbaharuiStimulus("");
stimulus.Show();
}
我希望这对你有帮助!

TA贡献2019条经验 获得超9个赞
您可以Invoke(...)
像您所做的那样使用后台工作人员以任何形式更新标签。(假设刺激是一个场)。调用一次 Invoke 就足够了。Stimulus.Invoke
在激励表单的控制线程上执行委托。所以你可以决定,当你调度线程时。我建议在 中执行此操作perbarauiStimulus
,因为这样可以减少有人忘记发送呼叫的机会。
但是您的代码存在一个潜在问题:
不要使用经过时间的精确比较。更喜欢使用'>='。由于您正在处理秒数,因此这很少会成为实际问题,但可能会导致无限循环。
如果stimulus
不是字段,则必须在后台工作人员Stimulus
之外创建一个实例,因为如果您在工作人员方法内创建它,表单将在后台工作人员线程上运行其消息循环。这消除了后台工作人员的使用,因为该操作现在从 sytimulus 视图同步运行。

TA贡献1815条经验 获得超13个赞
您不应该在后台线程中创建表单。这样做会将表单分配给该线程而不是 UI 线程,这意味着该表单现在位于与消息泵不同的线程上。
解决此问题的方法是在 UI 线程上调用表单的实例化和查看,然后您的以下Invoke调用应该可以工作。
Stimulus stimulus;
this.Invoke((MethodInvoker)delegate
{
stimulus = new Stimulus();
stimulus.Show();
});
//No need to invoke this since perbaharuiStimulus() calls Invoke() as well.
stimulus.perbaharuiStimulus("+");
//The rest of your code...
除此之外,您所做的一切都是正确的。
- 3 回答
- 0 关注
- 210 浏览
添加回答
举报