C# - 課題:執行時,及時插入資料(使用Dictionary)

摘要:C# - 課題:執行時,及時插入資料(使用Dictionary)

近日在撰寫一些測試程式時,法師(主管)希望在連續的指令處理下,可以插入即時性的指令,這個課題挺有趣的。當時的念頭就是使用 Queue 來試試,或許可以很快的解決問題。
說時遲、那時快,法師憑藉著強大的法力,忽然下了「Queue封印之術」,筆者當下只好乖乖的想其他方式嚕,第二個想到的就是使用Dictionary類別。
話說回來,在那之後筆者也有用過 Queue 來呈現這個課題,兩者都會出現相同的狀況喔,這就留待給看倌自己去測測看嚕...
廢話不多說了,以下是此課題的範例...

畫面:


Code:

namespace WindowsFormsApplication1
{
    public partial class MainForm : Form
    {
        Dictionary<string, string> ditTimelyData = new Dictionary<string, string>();

        public MainForm()
        {
            InitializeComponent();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtWait.Text))
            {
                MessageBox.Show("等待值不允許空白!!");
                return;
            }

            txtResult.Text = string.Empty;

            int iForStart = Convert.ToInt32(txtStart.Text);
            int iForEnd = Convert.ToInt32(txtEnd.Text);
            int iWait = Convert.ToInt32(txtWait.Text);

            //將 Focus 轉移到 Form
            this.Focus();

            for (int i = iForStart; i <= iForEnd; i++)
            {
                //處理指令插入:執行完後,將 Dictionary 中符合的 Key 刪除
                List<string> listTimelyData = new List<string>(ditTimelyData.Keys);
                foreach (string itemRow in listTimelyData)
                {
                    string itemRowValue = string.Empty;
                    ditTimelyData.TryGetValue(itemRow, out itemRowValue);
                    UpdateResult(itemRowValue);
                    ditTimelyData.Remove(itemRow);
                }

                UpdateResult(i.ToString());
                System.Threading.Thread.Sleep(iWait);
            }
        }

        private void btnTimely_Click(object sender, EventArgs e)
        {
            //對 Dictionary 增加資料
            ditTimelyData.Add(Guid.NewGuid().ToString(), txtTimelyData.Text);
        }

        /// <summary>
        /// 更新結果
        /// </summary>
        /// <param name="p_Value">參數值</param>
        private void UpdateResult(string p_Value)
        {
            //透過委派的方式來更新結果文字方框
            txtResult.Invoke(new EventHandler(delegate
            {
                txtResult.AppendText("第 " + p_Value + " 次執行" + Environment.NewLine);
            }));

            //更新 Windows 訊息
            Application.DoEvents();
        }
    }
}

結果:


呆言呆語:
不管是使用 Dictionary 還是 Queue 均會發生下圖狀況,只要能想一想、「繞個彎」,您自然也會完成這個課題