0
public partial class _Default : System.Web.UI.Page
{
    private static Stopwatch timer = new Stopwatch();
    Thread timeThread = new Thread(timeKeeper);
    private static int min = 0, sec = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void startstop_Click(object sender, EventArgs e)
    {
        timeThread.Start();
        if(timer.IsRunning()) {timer.Stop}
        else timer.Start();
    }
    private static void timeKeeper()
    {
        while (timer.IsRunning)
        {
            mydelegate();
        }
    }
    private static void mydelegate()
    {
        _Default temp = new _Default();
        temp.Update();
    }
    private void Update()
    {
        min = timer.Elapsed.Minutes;
        sec = timer.Elapsed.Seconds;
        time.Text = min + ":" + sec;
    }
}

私がやりたいのは、ストップウォッチを制御するボタンがあることです。クリックすると開始し、もう一度クリックすると停止します。time.text 表示の更新を継続し、ボタンを引き続きクリックできるようにする場合は、スレッドを使用するのが最善の方法であると考えました。上記のプログラムを実行すると、time.text = min + ":" + sec; になります。nullreferenceexception をスローします。これを修正する方法についての助けをいただければ幸いです。私は C#/asp.net でのプログラミングが初めてです。

これよりもデリゲートを操作するより良い方法はありますか。通常の/わかりやすいチュートリアルやブログがあまりないので、それらの使用方法を調べるのに何時間も費やしました

4

2 に答える 2

1

どこから始めればよいかわかりません。

Web ページをプログラミングしていることを思い出してください。サーバーを呼び出すたびに、サーバー上で新しい Web ページのライフサイクルが発生します。そのため、Web ページでスレッドを使用しても、正しい動作にはなりません。

必要な種類の動作を取得するには、サーバーではなくクライアントでタイマーとクリック処理を実行する必要があります。これを容易にするために jQuery を使用できます。もう 1 つのオプションは、サーバーを最新の状態に保つ必要がある場合に ajax を使用することです。

于 2012-08-20T19:45:38.123 に答える
0

問題はここにあるようです:

_Default temp = new _Default();

新しいクラスは ASP.Net パイプラインを通過しないため、マークアップ ( time ) でコントロールを更新しようとしても、実際には読み込まれていません。

ここでのあなたのアプローチには少し欠陥があると思います。サーバー側でそれを行う場合は、Ajax リクエスト (または Web ソケット) を繰り返し使用して、ブラウザーをサーバー上のタイマー オブジェクトと同期させる必要があります。言うまでもなく、複数のユーザーがいて、スレッドが衝突し始めるとどうなりますか? Javascriptを使用する方がはるかに優れているようです。

于 2012-08-20T19:42:32.103 に答える