2014年1月3日 星期五

C# 透過 Multi-Thread 變動表單元件

在創建一個對象並將其作為參數傳遞給線程。
當這樣做時,對象通過引用傳遞,這意味著所做的任何更改都會運作在反射的對象上。

Thread t = new Thread((formObj) =>
{
    (formObj as Form1).ShowDialog();
});
t.Start(myForm);

DataGridView dgv = new DataGridView();
dgv.Dock = DockStyle.Fill;
if (myForm.InvokeRequired)
    myForm.BeginInvoke(new Action(() => { myForm.Controls.Add(dgv); }));
else

    myForm.Controls.Add(dgv);


這裡需要考慮的一些事項:
窗體的對像是在主線程上創建的,但窗口是在子線程中創建的,這就是本體窗口的所有者將是子線程的原因。

注意if(myForm.InvokeRequired)的使用,在這種情況下為true,然後導致應用程序BeginInvoke控件並調用其所有者線程來更改其UI。

為了能夠訪問表單的多個實例,需要使用諸如Dictionary <TKey,TValue>之類的集合以及上面的代碼來收集這些表單,這些表單可能與標識符號配對。


這邊可以去思考不使用System.Windows.Forms.Timer而不是調用主窗體的方法。

private Timer _timer;
private void Form1_Load(object sender, EventArgs e)
{
    if (_timer == null)
    {
        _timer = new Timer
        {
            Interval = (int)TimeSpan.FromSeconds(10).TotalMilliseconds
        };
        _timer.Tick += (s, args) =>
        {
            //在這裡調用表單本身的方法
        };
        _timer.Start();
    }

}

這樣表單會在顯示時初始化一個計時器,並且該計時器將在計時器上調用該方法,這對開發者來說不會那麼麻煩。

我覺得只要用到線程這種技巧時,有時候要很小心,一用不好會Debug De到海枯石爛、地老天荒。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言