當這樣做時,對象通過引用傳遞,這意味著所做的任何更改都會運作在反射的對象上。
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到海枯石爛、地老天荒。
-雲遊山水為知已逍遙一生而忘齡- 電腦神手
沒有留言:
張貼留言