0

私のアプリケーションは常にレコードを更新するために実行されています。Excelファイルをメールで送信する機能があります。毎日設定した時間までにお送りします。だから私はタイマー方式を使用します。それは私の機能を起動することができます。タイマー間隔を100に設定しました。現在の時計が10.00PMであるとすると、データベースで同じ場合、sendMail関数が起動します。

しかし、今の問題は、タイマーが私の関数を複数回起動することです。約10回以下だと思います。一度だけ火が欲しい。私が使用すべき最良の方法は何ですか?

// 0 is off and 1 is on
int on_off = int.Parse(class_ta.getValue("tbl_setting", "value", "name", "onOffMail"));

if (on_off == 1)
{
    DataTable dtSendTime = class_ta.valueTimeSend(0);

    foreach (DataRow row in dtSendTime.Rows)
    {
        DateTime dtFire = DateTime.Parse(row["sendTime"].ToString());
        TimeSpan tsHour = TimeSpan.Parse(dtFire.Hour.ToString());
        TimeSpan tsMinutes = TimeSpan.Parse(dtFire.Minute.ToString());

        if (tsHour == TimeSpan.Parse(DateTime.Now.TimeOfDay.Hours.ToString()) && tsMinutes == TimeSpan.Parse(DateTime.Now.TimeOfDay.Minutes.ToString()) && 0 == int.Parse(DateTime.Now.TimeOfDay.Seconds.ToString()))
        {
            sendMail();
        }
    }
}

誰かが私がこの問題を解決するのを手伝ってくれることを願っています、ありがとう。

4

5 に答える 5

2

イベントが発生するとすぐに、Enabledフィールドをに設定できます。false

timer.Enabled = false;

電話でタイマーを停止することもできます

timer.Stop(); // sets timer.Enabled to false

ソース:MSDN

編集:

もう1つの可能性は、タイマーの間隔を単純に増やすことです。

timer.Interval = 1000;

そうすれば、タイマーを常に無効/再度有効にする必要はありません。

于 2013-03-06T15:06:20.377 に答える
2

タイマーは一度発火したらすぐにストップ。

timer1.Stop();

また

timer1.Enabled = false;

これを Tick イベントの最初の行として実行します。

于 2013-03-06T15:08:09.107 に答える
1

インターバル時間を 100 から 1000 に変更するだけです。

メール機能を 1 秒間に 10 回発射します。

于 2013-03-06T15:23:18.593 に答える
1

コードからタイマーについては何もわかりません。これは推測ですが、タイマーのtickイベント内のコードの最初の行として次を含めることができます。

myTimer.Stop();
于 2013-03-06T15:07:10.180 に答える
1

彼らがいつも言うように、車輪を再発明しないでください. アプリケーションを常に実行する代わりに、Windows タスク スケジューラから起動してみませんか? こうすることで、アプリからすべてのタイマーとスケジューリング コードを削除し、起動時にメールの送信に集中させることができます。

または、データベースの内容によってスケジュールを制御する必要がある場合は、データベースにいくつかの情報を設定して、電子メールが送信されたことを通知します。

各行が 1 つのメールのみを送信する必要がある場合はIsSent、デフォルトで 0 に設定されている列をテーブルに追加します。テーブルをクエリするときは、WHERE 句でこれを使用します。

WHERE IsSent = 0
    AND sendTime <= GetDate()

次に、返される行は、今すぐ電子メールを送信する必要がある行であることがわかります。それぞれについて、メールを送信し、IsSentその行の列を 1 に更新します。

各行が毎日特定の時間にメールを送信する必要がある場合は、LastSentTimeデフォルトで NULL に設定されている列をテーブルに追加します。

WHERE (@LastSentTime IS NULL OR DateDiff(day, @LastSentTime, GetDate()) > 0)
    AND @SendTime-DATEADD(day,DATEDIFF(day,0,@SendTime),0) < GetDate()-DATEADD(day,DATEDIFF(day,0,GetDate()),0)

それぞれについて、電子メールを送信し、LastSentTimeその行の を現在の時刻に更新します。

于 2013-03-06T15:36:28.307 に答える