Form1.cs:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Diagnostics;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Threading;
- namespace TPEPublicValuePriceWinForm
- {
- public partial class Form1 : Form
- {
- //臺北市的timer
- System.Windows.Forms.Timer tpeProgrssBarTimer = new System.Windows.Forms.Timer();
- System.Windows.Forms.Timer tpeQueryTPETimer = new System.Windows.Forms.Timer();
- System.Windows.Forms.Timer tpeAvgSpeedTimer = new System.Windows.Forms.Timer();
- //新北市的timer
- System.Windows.Forms.Timer newTpeProgrssBarTimer = new System.Windows.Forms.Timer();
- System.Windows.Forms.Timer newTpeQueryTPETimer = new System.Windows.Forms.Timer();
- System.Windows.Forms.Timer newTpeAvgSpeedTimer = new System.Windows.Forms.Timer();
- bool tpeWCFCalling = false;
- bool newTpeWCFCalling = false;
- //臺北市的狀態記錄
- int tpeNowCount;//現在執行完畢的筆數
- int tpeOldCount;//五秒前的執行完畢的筆數
- int tpeTotalCount;//臺北市總筆數
- //新北市的狀態記錄
- int newTpeNowCount;//現在執行完畢的筆數
- int newTpeOldCount;//五秒前的執行完畢的筆數
- int newTpeTotalCount;//新北市總筆數
- //臺北市的平均執行速度狀態記錄
- int tpeOldMinuteCount; //一分鐘前執行完畢的筆數
- int tpeNowMinuteCount; //目前執行完畢的筆數
- //新北市的平均執行速度狀態記錄
- int newTpeOldMinuteCount; //一分鐘前執行完畢的筆數
- int newTpeNowMinuteCount; //目前執行完畢的筆數
- string tpeCityCode = "0000"; //臺北市城市代碼
- string newTpeCityCode = "0001";//新北市程式代碼
- public Form1()
- {
- InitializeComponent();
- init();
- }
- private void init()
- {
- //初始化筆數
- using (rehouseEntities db = new rehouseEntities())
- {
- //臺北市總筆數
- TPETotalCountLbl.Text = db.pft23.Where(p => p.city_code == tpeCityCode).Count().ToString();
- tpeTotalCount = Convert.ToInt32(TPETotalCountLbl.Text);
- //臺北市執行完畢筆數
- TPEFinCountLbl.Text = GetTpeFinCountNow().ToString();
- //新北市總筆數
- NewTPETotalCountLbl.Text = db.pft23.Where(p => p.city_code == newTpeCityCode).Count().ToString();
- newTpeTotalCount = Convert.ToInt32(NewTPETotalCountLbl.Text);
- //新北市執行完畢筆數
- NewTPEFinCountLbl.Text = GetNewTpeFinCountNow().ToString();
- }
- //為timer設定事件
- //臺北市
- tpeProgrssBarTimer.Interval = Convert.ToInt16(Config.ProgressBarCheckTime);//3 secs顯示一次進度
- tpeProgrssBarTimer.Tick += new System.EventHandler(tpeProgrssBarTimer_Tick);
- tpeQueryTPETimer.Interval = Convert.ToInt16(Config.SleepTime);//10 secs檢查一次是否有正在查詢
- tpeQueryTPETimer.Tick += new System.EventHandler(tpeQueryTPETimer_Tick);
- tpeAvgSpeedTimer.Interval = Convert.ToInt32(Config.AverageSpeedCheckTime);//60 secs檢查一次是否有正在查詢
- tpeAvgSpeedTimer.Tick += new System.EventHandler(queryTPEAverageSpeed_Tick);
- //新北市
- newTpeProgrssBarTimer.Interval = Convert.ToInt16(Config.ProgressBarCheckTime);//3 secs顯示一次進度
- newTpeProgrssBarTimer.Tick += new System.EventHandler(newTpeProgrssBarTimer_Tick);
- newTpeQueryTPETimer.Interval = Convert.ToInt16(Config.SleepTime);//10 secs檢查一次是否有正在查詢
- newTpeQueryTPETimer.Tick += new System.EventHandler(newTpeQueryTPETimer_Tick);
- newTpeAvgSpeedTimer.Interval = Convert.ToInt32(Config.AverageSpeedCheckTime);//60 secs檢查一次是否有正在查詢
- newTpeAvgSpeedTimer.Tick += new System.EventHandler(queryNewTPEAverageSpeed_Tick);
- }
- #region control event
- //按下查詢臺北
- private void QueryTPEBtn_Click(object sender, EventArgs e)
- {
- TPETimerStart();
- exeTPEStatusLbl.Text = "執行中";
- exeTPEStatusLbl.Text = "執行中";
- tpeNowCount = GetTpeFinCountNow();
- tpeOldCount = tpeNowCount;
- tpeNowMinuteCount = tpeNowCount;
- tpeOldMinuteCount = tpeNowCount;
- MessageBox.Show("已開始查詢臺北!");
- }
- //停止查詢臺北
- private void stopTPEBtn_Click(object sender, EventArgs e)
- {
- tpeProgrssBarTimer.Stop();
- tpeQueryTPETimer.Stop();
- tpeAvgSpeedTimer.Stop();
- exeTPEStatusLbl.Text = "停止";
- MessageBox.Show("已停止查詢臺北!");
- }
- //按下查詢新北
- private void QueryNewTPEBtn_Click(object sender, EventArgs e)
- {
- NewTPETimerStart();
- exeNewTPEStatusLbl.Text = "執行中";
- exeNewTPEStatusLbl.Text = "執行中";
- newTpeNowCount = GetNewTpeFinCountNow();
- newTpeOldCount = newTpeNowCount;
- newTpeNowMinuteCount = newTpeNowCount;
- newTpeOldMinuteCount = newTpeNowCount;
- MessageBox.Show("已開始查詢新北!");
- }
- //停止查詢新北
- private void stopNewTPEBtn_Click(object sender, EventArgs e)
- {
- newTpeProgrssBarTimer.Stop();
- newTpeQueryTPETimer.Stop();
- newTpeAvgSpeedTimer.Stop();
- exeNewTPEStatusLbl.Text = "停止";
- MessageBox.Show("已停止查詢新北!");
- }
- #endregion
- #region Timer Event
- //持續更新畫面上查詢臺北的進度
- private void tpeProgrssBarTimer_Tick(object sender, EventArgs e)
- {
- TPEFinCountLbl.Text = GetTpeFinCountNow().ToString();
- int temp = DateTime.Now.Millisecond % 3;
- if(temp ==0)
- {
- exeTPEStatusLbl.Text = "執行中。。。。。。";
- }
- else if (temp == 1)
- {
- exeTPEStatusLbl.Text = "執行中。。。。";
- }
- else if (temp == 2)
- {
- exeTPEStatusLbl.Text = "執行中。。";
- }
- }
- //每3秒持續呼叫臺北wcf一次
- private void tpeQueryTPETimer_Tick(object sender, EventArgs e)
- {
- tpeNowCount = GetTpeFinCountNow();//現在執行完畢的筆數
- //尚未達到總筆數的時候
- if (tpeNowCount != tpeTotalCount)
- {
- //等上次呼叫的兩百筆執行完才繼續呼叫
- if (tpeNowCount == tpeOldCount
- || tpeNowCount >= tpeOldCount + Convert.ToInt32(Config.OnceTakeCount)
- - Convert.ToInt32(Config.OnceTakeCount) * Convert.ToDouble(Config.NoResponseRate))
- {
- //上次呼叫的執行完的時候,接續著呼叫下一個兩百筆wcf
- //或是只差一點就執行完畢兩百筆的時候,接著呼叫下一個兩百筆
- //呼叫之前,先記錄目前執行完畢的筆數
- //如果正在呼叫中,就不要一直呼叫,不然iis會過載
- if (tpeWCFCalling == false)
- {
- tpeOldCount = GetTpeFinCountNow();
- tpeWCFCalling = true;
- Task.Run(() => QueryTPEByService());
- }
- }
- else if(tpeNowCount < tpeOldCount + Convert.ToInt32(Config.OnceTakeCount))
- {
- //還沒執行完上次呼叫的兩百筆,什麼都不做
- }
- else
- {
- //
- }
- }
- else
- {
- //已經到達總筆數
- TPEFinCountLbl.Text = tpeNowCount.ToString();
- exeTPEStatusLbl.Text = "已執行完畢!";
- StopTpeTimer();
- }
- }
- //確認每分鐘臺北查詢速度
- private void queryTPEAverageSpeed_Tick(object sender, EventArgs e)
- {
- using (rehouseEntities db = new rehouseEntities())
- {
- tpeNowMinuteCount = GetTpeFinCountNow();
- string avgSpeedResult = DateTime.Now.ToString("hh:mm") + "完成筆數:" + Convert.ToString(tpeNowMinuteCount - tpeOldMinuteCount);
- TPEAvgSpeedTxt.Text = TPEAvgSpeedTxt.Text + avgSpeedResult + "\r\n";
- //每三分鐘檢查一次是否速度降為零
- //是的話,就重送
- if (DateTime.Now.Minute % 3 == 0 && tpeNowCount != tpeTotalCount)
- {
- if (tpeNowMinuteCount - tpeOldMinuteCount == 0)
- {
- tpeOldCount = tpeNowCount;
- }
- }
- tpeOldMinuteCount = GetTpeFinCountNow();//記錄一分鐘前執行完畢的筆數
- }
- }
- //持續更新畫面上查詢新北的進度
- private void newTpeProgrssBarTimer_Tick(object sender, EventArgs e)
- {
- NewTPEFinCountLbl.Text = GetNewTpeFinCountNow().ToString();
- int temp = DateTime.Now.Millisecond % 3;
- if (temp == 0)
- {
- exeNewTPEStatusLbl.Text = "執行中。。";
- }
- else if (temp == 1)
- {
- exeNewTPEStatusLbl.Text = "執行中。。。。。。";
- }
- else if (temp == 2)
- {
- exeNewTPEStatusLbl.Text = "執行中。。。。";
- }
- }
- //每五秒持續呼叫新北wcf一次
- private void newTpeQueryTPETimer_Tick(object sender, EventArgs e)
- {
- newTpeNowCount = GetNewTpeFinCountNow();//現在執行完畢的筆數
- //尚未達到總筆數的時候
- if (newTpeNowCount != newTpeTotalCount)
- {
- //等上次呼叫的兩百筆執行完才繼續呼叫
- if (newTpeNowCount == newTpeOldCount
- || newTpeNowCount >= newTpeOldCount + Convert.ToInt32(Config.OnceTakeCount)
- - Convert.ToInt32(Config.OnceTakeCount) * Convert.ToDouble(Config.NoResponseRate))
- {
- //上次呼叫的執行完的時候,接續著呼叫下一個兩百筆wcf
- //或是只差一點就執行完畢兩百筆的時候,接著呼叫下一個兩百筆
- //呼叫之前,先記錄目前執行完畢的筆數
- //如果正在呼叫中,就不要一直呼叫,不然iis會過載
- if (newTpeWCFCalling == false)
- {
- newTpeOldCount = GetNewTpeFinCountNow();
- newTpeWCFCalling = true;
- Task.Run(() => QueryNewTPEByService());
- }
- }
- else if (newTpeNowCount < newTpeOldCount + Convert.ToInt32(Config.OnceTakeCount))
- {
- //還沒執行完上次呼叫的兩百筆,什麼都不做
- }
- else
- {
- //
- }
- }
- else
- {
- //已經到達總筆數
- NewTPEFinCountLbl.Text = newTpeNowCount.ToString();
- exeNewTPEStatusLbl.Text = "已執行完畢!";
- StopNewTpeTimer();
- }
- }
- //確認每分鐘新北查詢速度
- private void queryNewTPEAverageSpeed_Tick(object sender, EventArgs e)
- {
- using (rehouseEntities db = new rehouseEntities())
- {
- newTpeNowMinuteCount = GetNewTpeFinCountNow();
- string avgSpeedResult = DateTime.Now.ToString("hh:mm") + "完成筆數:" + Convert.ToString(newTpeNowMinuteCount - newTpeOldMinuteCount);
- NewTPEAvgSpeedTxt.Text = NewTPEAvgSpeedTxt.Text + avgSpeedResult + "\r\n";
- //每三分鐘檢查一次是否速度降為零
- //是的話,就重送
- if (DateTime.Now.Minute % 3 == 0 && newTpeNowCount != newTpeTotalCount)
- {
- //如果新北市官網的回應太少導致ResponseRate太低導致該分鐘的速度為0的話,就再度重送
- if (newTpeNowMinuteCount - newTpeOldMinuteCount == 0)
- {
- newTpeOldCount = newTpeNowCount;
- }
- }
- newTpeOldMinuteCount = GetNewTpeFinCountNow();//記錄一分鐘前執行完畢的筆數
- }
- }
- private void StopTpeTimer()
- {
- tpeProgrssBarTimer.Stop();
- tpeQueryTPETimer.Stop();
- tpeAvgSpeedTimer.Stop();
- }
- private void StopNewTpeTimer()
- {
- newTpeProgrssBarTimer.Stop();
- newTpeQueryTPETimer.Stop();
- newTpeAvgSpeedTimer.Stop();
- }
- #endregion
- #region custom method
- //取得臺北目前查詢完畢的資料筆數
- private int GetTpeFinCountNow()
- {
- using (rehouseEntities db = new rehouseEntities())
- {
- return db.pft23.Where(p => (p.devo_value != null || p.ground_price != null) && p.city_code == tpeCityCode).Count();
- }
- }
- //呼叫wcf查詢臺北
- private void QueryTPEByService()
- {
- TPELandPublicValuePriceService.ServiceClient sc = new TPELandPublicValuePriceService.ServiceClient();
- using (rehouseEntities db = new rehouseEntities())
- {
- var pft23s = db.pft23.Where(p => p.devo_value == null && p.ground_price == null && p.city_code == tpeCityCode).Take(Convert.ToInt16(Config.OnceTakeCount));
- foreach (var p23 in pft23s)
- {
- sc.GetTPELandPublicValuePrice(p23.zip_code, p23.session_id, p23.area_no);
- }
- }
- sc.Close();
- tpeWCFCalling = false;//呼叫完畢
- }
- //啟動臺北timer
- private void TPETimerStart()
- {
- tpeProgrssBarTimer.Start();
- tpeQueryTPETimer.Start();
- tpeAvgSpeedTimer.Start();
- }
- //取得新北目前查詢完畢的資料筆數
- private int GetNewTpeFinCountNow()
- {
- using (rehouseEntities db = new rehouseEntities())
- {
- return db.pft23.Where(p => (p.devo_value != null || p.ground_price != null) && p.city_code == newTpeCityCode).Count();
- }
- }
- //呼叫wcf查詢臺北
- private void QueryNewTPEByService()
- {
- TPELandPublicValuePriceService.ServiceClient sc = new TPELandPublicValuePriceService.ServiceClient();
- using (rehouseEntities db = new rehouseEntities())
- {
- var pft23s = db.pft23.Where(p => p.devo_value == null && p.ground_price == null && p.city_code == newTpeCityCode).Take(Convert.ToInt16(Config.OnceTakeCount));
- foreach (var p23 in pft23s)
- {
- sc.GetNewTPELandPublicValuePrice(p23.zip_code, p23.session_id, p23.area_no);
- }
- }
- sc.Close();
- newTpeWCFCalling = false;//呼叫完畢
- }
- //啟動新北timer
- private void NewTPETimerStart()
- {
- newTpeProgrssBarTimer.Start();
- newTpeQueryTPETimer.Start();
- newTpeAvgSpeedTimer.Start();
- }
- #endregion
- }
- }
Config.cs:方便快速存取appsetting用的類別
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Configuration;
- namespace TPEPublicValuePriceWinForm
- {
- public class Config
- {
- public static string SleepTime = GetAppSettings("SleepTime");
- public static string ProgressBarCheckTime = GetAppSettings("ProgressBarCheckTime");
- public static string AverageSpeedCheckTime = GetAppSettings("AverageSpeedCheckTime");
- public static string ResponseLostTime = GetAppSettings("ResponseLostTime");
- public static string AutoStopCount = GetAppSettings("AutoStopCount");
- public static string AutoInitCount = GetAppSettings("AutoInitCount");
- public static string OnceTakeCount = GetAppSettings("OnceTakeCount");
- public static string NoResponseRate = GetAppSettings("NoResponseRate");
- private static string GetAppSettings(string key)
- {
- return ConfigurationManager.AppSettings[key];
- }
- }
- }
app.config檔裡面參考的參數:主要是設定timer每多少秒數要執行一次
<appSettings>
<add key="SleepTime" value="3000"/>
<add key="ProgressBarCheckTime" value="3000"/>
<add key="AverageSpeedCheckTime" value="60000"/>
<add key="ResponseLostTime" value="150000"/>
<add key="AutoStopCount" value="10"/>
<add key="AutoInitCount" value="30"/>
<add key="OnceTakeCount" value="200"/>
<add key="NoResponseRate" value="0.1"/>
</appSettings>
沒有留言:
張貼留言