摘要: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 均會發生下圖狀況,只要能想一想、「繞個彎」,您自然也會完成這個課題