0

皆さんおはよう、

C#.NET4.0およびVisualStudio2012Expressを使用します。

いくつかのSQLストアドプロシージャを実行し、データベースにアクセスしてレポートを自動生成し、それらを電子メールで送信するプログラムがあります。

日付を設定しているので、深夜になるとすぐに実行されます。

以下はコードサンプルです。

private void button1_Click(object sender, EventArgs e)
{
    Thread myUltiThread = new Thread(GetCurrentDate);
    myUltiThread.Start();
}

private void GetCurrentDate()
{
    string myDate = "";
    myDate = DateTime.Today.Day.ToString();

    if(myDate == "7" && myDateToggle == false)
    {
        Task t = new Task(() => RunMonthBackUp());
        t.Start();
    }

    if (myDate == "8" && myDateToggle == true)
    {
        myDateToggle = false;
    }
}

ボタンが押されるとわかるように、プログラムはgetdateメソッドを使用するスレッドを開始します。このメソッドは、日付が正しいかどうかをチェックします。

その場合、プロセス全体を実行するタスクを開始します。

私の問題は、これが発生していないことです。メソッドが1回しか実行されていないためだと思います。これは、スレッドの操作についての理解が不足しているためだと感じています(通常はタスクのみを処理します)。

誰かが私がどこで間違っているのか、そしてこれを正しく設定する方法を私に指摘できますか?

みんなありがとう

4

3 に答える 3

1

GetCurrentDateメソッドが終了すると、スレッドは終了します。メソッドにループを設定し、定期的に条件を確認する必要があります。または、タイマー(System.Threading.Timer)を設定して、状態を定期的にチェックすることもできます。

これが最初の方法です:

private void button1_Click(object sender, EventArgs e)
{
    Thread myUltiThread = new Thread(GetCurrentDate);
    myUltiThread.IsBackground = true;
    myUltiThread.Start();
}

private void GetCurrentDate()
{
    while(true)
    {
        int = DateTime.Today.Day;

        if(myDate == 7 && myDateToggle == false)
        {
            Task t = new Task(() => RunMonthBackUp());
            t.Start();
        }

        if (myDate == 8 && myDateToggle == true)
        {
            myDateToggle = false;
        }

        Thread.Sleep(1);
    }
}

また、スレッドをバックグラウンドスレッドにしたので、スレッドの終了について心配する必要はありません。スレッドは、プログラムが終了するまで機能し続けます。

于 2012-11-07T11:54:35.913 に答える
1

完了後にチェックを繰り返すコードがないため、メソッドは 1 回だけ実行されます。

1 日に 1 回作動するタイマーを開始し、そこGetCurrentDateから呼び出す必要があります。

または、タスクを 1 回だけ実行し、それをスケジュールされたタスクとして実行する単純なプログラムとしてコードを作成することをお勧めします。

于 2012-11-07T11:21:14.163 に答える
1

このようにしてみませんか?

    private void button1_Click(object sender, EventArgs e)
    {
        Task.Factory.StartNew( () => GetCurrentDate() );
    }

    private void GetCurrentDate()
    {
        if ( DateTime.Today.Day == 7 && myDateToggle == false )
        {
            Task.Factory.StartNew( () => RunMonthBackUp());
        }
        else if ( DateTime.Today.Day == 8 && myDateToggle == true )
        {
            myDateToggle = false;
        }
    }

これに他に何か問題がある場合、それはあなたの奇妙な「トグル」に関係しています

于 2012-11-07T11:27:25.977 に答える