0

我有一个奇怪的情况。
请看backgroundWorker5_RunWorkerCompleted活动:

    private void backgroundWorker5_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        btnStartAdventures.Text = "Start Adventure";
        btnStartAdventures.Enabled = true;

        if (e.Error != null)
        {
            MessageBox.Show(e.Error.Message);
            return;
        }
        if (e.Cancelled)
        {
            lblStatusValueInAdventures.Text = "Cancelled...";
        }
        else
        {
            lblStatusValueInAdventures.Text = "Completed";
            timer1.Enabled = true;
            timer1.Start();
            // MessageBox.Show("start timer");
            Thread.Sleep((int.Parse(txtDelayInAdventures.Text)) * 60000);
            //MessageBox.Show("end timer");
            timer1.Enabled = false;
            timer1.Stop();
            lblTimer.Text = "0";
            btnStartAdventures.PerformClick();
        }
    }

那个计时器是:

private void timer1_Tick(object sender, EventArgs e)
{
    this.Invoke(new MethodInvoker(delegate { lblTimer.Text = (int.Parse(lblTimer.Text) + 1).ToString(); }));
}

但是这个定时器不能改变lblTimer's Text
我该如何解决这个问题?

编辑:
Thread.Sleep 是必要的,我无法删除它。
我想要一个永无止境的循环,而这些代码就是为此而设计的。

提前致谢

4

3 回答 3

1
Thread.Sleep

有你的问题。

永远不要调用Thread.SleepUI 线程;它会冻结用户界面。

摆脱它,它会正常工作。

您可以将其余的工作放在计时器回调中。

您还可以使用 C# 5 async 来简化此操作。

于 2012-09-30T16:42:02.873 回答
1

您必须刷新项目。

lblTimer.Refresh()

你也可以刷新表格

frmName.Refresh();

并使线程休眠 0 毫秒,从而为其他进程提供空间。

于 2012-09-30T16:42:55.403 回答
1

按照要求;

“永无止境的循环”是什么意思?UI 线程上的A Thread.Sleep(RunWorkerCompleted 事件在 UI 线程上执行)将有效地冻结 UI 线程,这意味着不会显示与 UI 线程的交互。

评论:

你想达到什么目的?据我所知,您正在后台线程 - backgroundWorker5 - (UI线程是响应式的)中做一些工作。当 backgroundWorker5 完成后,您想启动一个计时器并在 UI 仍然响应时在标签中显示一个计数器(也许有人要停止计时器?)。类似的东西?– 马里奥 3 分钟前 编辑

是的,你是对的。我想要一个循环,它永远不会停止,直到用户单击取消按钮。– MoonLight 1 分钟前

所以,试试这样的事情:

int time = 0;

private void backgroundWorker5_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    btnStartAdventures.Text = "Start Adventure";
    btnStartAdventures.Enabled = true;

    if (e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
        return;
    }
    if (e.Cancelled)
    {
        lblStatusValueInAdventures.Text = "Cancelled...";
    }
    else
    {
        lblStatusValueInAdventures.Text = "Completed";
        timer1.Interval = 1000; //<--- Tick each second, you can change this.
        timer1.Enabled = true;
        timer1.Start();
        // MessageBox.Show("start timer");
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    lblTimer.Text = (time + 1).ToString();
}

private void button_Cancel_Click(object sender, EventArgs e)
{
    //MessageBox.Show("end timer");
    timer1.Enabled = false;
    timer1.Stop();
    lblTimer.Text = "0";
    btnStartAdventures.PerformClick();
}
于 2012-09-30T17:13:12.713 回答