我對WPF很新穎。剛開始學習線程。線程的正確方法
這是我的場景: 我用一個名爲START的按鈕創建了一個程序。當單擊開始按鈕時,它開始在不同的線程中執行一些複雜的任務。在開始複雜任務之前,它還在另一個STA線程(技術上我不知道我在說什麼)創建了中的UI元素。
這裏是一個示例代碼:
// button click event
private void button1_Click(object sender, RoutedEventArgs e)
{
System.Threading.Thread myThread = new System.Threading.Thread(
() => buttonUpdate("Hello "));
myThread.Start();
}
private void buttonUpdate(string text)
{
System.Threading.Thread myThread = new System.Threading.Thread(createUI);
myThread.SetApartmentState(System.Threading.ApartmentState.STA);
// set the current thread to background so that it's existant will totally
// depend upon existance of main thread.
myThread.IsBackground = true;
myThread.Start();
// Please don't read this loop it's just for my entertainment!
for (int i = 0; i < 1000; i++)
{
System.Threading.Thread.Sleep(100);
button1.updateControl(new Action(
() => button1.Content = text + i.ToString()));
if (i == 100)
break;
}
// close main window after the value of "i" reaches 100;
this.updateControl(new Action(()=>this.Close()));
}
// method to create UI in STA thread. This thread will be set to run
// as background thread.
private void createUI()
{
// Create Grids and other UI component here
}
上面的代碼成功地做什麼,我想做的事情。但你認爲這是正確的方式嗎?到目前爲止,我在這裏沒有任何問題。
編輯:哎呀,我忘了提這個類:
public static class ControlException
{
public static void updateControl(this Control control, Action code)
{
if (!control.Dispatcher.CheckAccess())
control.Dispatcher.BeginInvoke(code);
else
code.Invoke();
}
}
如果你真正理解你在說什麼,可能會有所幫助。當你瞭解STA線程的含義時,做一些研究回來。 – 2011-12-29 18:40:41