C#定時執行一個操作

來源:互聯網
上載者:User
一個用戶端向伺服器端socket發送報文,但是伺服器端限制了發送頻率,假如10秒內只能發送1次,這時用戶端也要相應的做限制,初步的想法是在設定檔中儲存上次最後發送的時間,當前發送時和這個上次最後時間做比較,根據情況馬上發送還是休眠相應的時間。
舉個例子,伺服器發送頻率限制是10秒,上次最後發送時間是10:00:00,有兩種情況:
(1)目前時間是10:00:03,則過7秒後發送;
(2)目前時間是10:02:00,則馬上發送。

App.config
<!--發送頻率限制(秒)--><add key="MsgTimeLimit" value="10"/><!--上次最後發送時間--><add key="LastMsgTime" value="2013-11-1"/>
Test.cs
CancellationTokenSource ct;private void btnOK_Click(object sender, EventArgs e){     btnOK.Enabled = false;     Task t = new Task(() => Do(ct));     ct = new CancellationTokenSource();     t.Start();     t.ContinueWith((x) =>     {         this.SafeCall(() =>         {             richTextBox1.AppendText("任務結束\r\n");             btnOK.Enabled = true;         });     }); }private void btnCancel_Click(object sender, EventArgs e){    ct.Cancel();}/// <summary>/// 擷取發送剩餘的時間/// </summary>/// <returns></returns>private int GetMsgRestSeconds(){    int msgTimeLimit = 0;    //擷取要限制的間隔時間(秒)    int.TryParse(AppSettings.GetValue("MsgTimeLimit"), out msgTimeLimit);    if (msgTimeLimit == 0)        return 0;    //最近一次時間    string lastMsgTime = AppSettings.GetValue("LastMsgTime");    DateTime dtLastMsgTime = DateTime.MinValue;    DateTime.TryParse(lastMsgTime, out dtLastMsgTime);    DateTime dtNow = DateTime.Now;          if (dtLastMsgTime == DateTime.MinValue || dtLastMsgTime >= dtNow)        return 0;                     TimeSpan ts = dtNow - dtLastMsgTime;    int restSeconds = 0;    if (msgTimeLimit > ts.TotalSeconds)    {        restSeconds = msgTimeLimit - (int)ts.TotalSeconds;        restSeconds = restSeconds < 0 ? 0 : restSeconds;    }    return restSeconds;}

其中
AppSettings.SetValue()和AppSettings.GetValue()方法見:
http://blog.csdn.net/gdjlc/article/details/8284799

SafeCall是個擴充方法
public static void SafeCall(this Control ctrl, Action callback)
{
    if (ctrl.InvokeRequired)
        ctrl.Invoke(callback);
    else
        callback();
}

點擊【確認】按鈕執行結果如下:

正在發送第1個客戶...
請等待,暫停 10 秒
正在發送第2個客戶...
請等待,暫停 10 秒
正在發送第3個客戶...
任務結束

過了3秒鐘,點擊【確認】按鈕並在執行完第一個操作按【取消】執行結果如下:

請等待,暫停 7 秒
正在發送第1個客戶...
請等待,暫停 10 秒
正在發送第2個客戶...
任務3取消
任務結束

過了5秒鐘,點擊【確認】按鈕執行結果如下:

請等待,暫停 5 秒
正在發送第1個客戶...
請等待,暫停 10 秒
正在發送第2個客戶...
請等待,暫停 10 秒
正在發送第3個客戶...
任務結束

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.