-2

Windowsフォームアプリのタイマーに問題があります。アーカイブの時間を記録するためにタイマーを必要とするアーカイバ。しかし、何かがタイマーを中断していますか?

ストリームだと思います。タイマーが中断される原因について何かアドバイスはありますか?

public partial class Form1 : Form
{
    int timerCounter = 0;
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

    public Form1()
    {
        InitializeComponent();
        timer.Interval = 1000; 
        timer.Enabled = true;
    }

    public void button2_Click(object sender, EventArgs e)
    {
        timer.Start();
        timer.Tick += new EventHandler(timer1_Tick); 

        // code for archiving, streams

        timer.Stop(); 

        MessageBox.Show("Archive was created! :)");
    }

    public void timer1_Tick(object sender, EventArgs e)
    {
        this.label7.Text = (++timerCounter).ToString();
    }  

}

4

4 に答える 4

7

Windows フォーム タイマーはマルチスレッドではありません。つまり、tick イベントは、プログラムがアイドル状態のとき (メッセージ キューを介してメッセージを受信するとき) にのみ発生します。あなたのプログラムでは、そうではないようです。これは簡単に確認できます。アーカイブ プロセス中に UI が応答する場合は、Forms.Timerも実行され、問題は別の場所にあります。応答しない場合、フォーム (および結果としてタイマー) がブロックされます (アプリケーションのメッセージ キュー内のメッセージは処理されません)。

これには 2 つの方法があります。

  1. 達成したいことを行うには、バックグラウンドで非同期に実行されるSystem.Timers.Timerまたはを使用できます。System.Threading.Timerただし、UI はまだブロックされているため (上記を参照)、UI は更新されません (タイマー メソッドは停止します)。
  2. もう 1 つの方法は、アーカイブ プロセスにバックグラウンド ワーカーを使用することです (これは別のスレッドで実行されます)。UI とタイマーの応答性が維持されます。
于 2012-11-29T11:17:35.953 に答える
0

まず、長時間実行される操作は UI スレッド以外で実行する必要があることを知っておく必要があります。というわけで、アーカイブ自体を行う処理スレッドを作成し、Control.Invoke メソッドを使用して UI に通知します。Control.Invoke の msdn の説明

于 2012-11-29T11:28:03.757 に答える
-1

最初は、バックグラウンド スレッドでアーカイブを実行していると思いました。そうでない場合は、BackgroundWorker を使用してバックグラウンドで操作を実行することを検討する必要があります (いくつかの例を示します)。

ただし、より簡単な解決策は次のとおりです。

button2_Clickハンドラーを追加Application.DoEvents()してみてください(「ストリーム」がアーカイブを完了するのを待っていると思います)。タイマーが起動し、label7 が新しいテキスト値を再描画するためには、再描画イベントを処理する必要があります。

于 2012-11-29T11:18:20.883 に答える
-1

ここでタイマーを使用する必要はありませんTimeSpan

public void button2_Click(object sender, EventArgs e)
{
    DateTime startTime = DateTime.Now;

    // code for archiving, streams

    TimeSpan diff = DateTime.Now - startTime;

    MessageBox.Show("Archive was created! in " + diff.TotalSeconds + " seconds.");
}
于 2012-11-29T13:26:23.743 に答える