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スレッドを呼び出さないでください。UIがフリーズします。

それを取り除くと、それはうまくいくでしょう。

残りの作業はタイマーコールバックに入れることができます。

C#5非同期を使用して、これをはるかに簡単にすることもできます。

于 2012-09-30T16:42:02.873 に答える
1

アイテムを更新する必要があります。

lblTimer.Refresh()

また、フォームを更新することもできます

frmName.Refresh();

スレッドを0ミリ秒スリープさせて、他のプロセス用のスペースを確保します。

于 2012-09-30T16:42:55.403 に答える
1

ご要望に応じて;

「終わらないループ」とは?UI スレッド (UI スレッドで実行される RunWorkerCompleted イベント)Thread.Sleep上の は、実質的に UI スレッドをフリーズします。これは、UI スレッドとの対話が表示されないことを意味します。

コメント:

何を達成しようとしていますか?私が推測できる限り、バックグラウンド スレッド - backgroundWorker5 - (UI スレッドはレスポンシブです) でいくつかの作業を行っています。backgroundWorker5 が終了したら、タイマーを開始し、UI がまだ応答している間にラベルにカウンターを表示します (誰かがタイマーを停止するためでしょうか?)。そんな感じ?– マリオ 3 分前 編集

はい、あなたは正しいです。ループが必要で、ユーザーがキャンセル ボタンをクリックするまで停止しません。– ムーンライト 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 に答える