2009-04-08 104 views
0

在我的Windows應用程序中,我有一個用戶控件,而該控件又承載了其他一些用戶控件。我的帖子似乎沒有被創建......任何想法爲什麼?

,就在主用戶控件的構造函數結束之前,我嘗試創建一個線程...但它似乎並沒有被創建:

mainUserControl() 
{ 
    var t=new Thread(ThreadJob); 
    t.IsBackground=true; 
    t.Start(); 
} 


private void ThreadJob() 
{ 
    //Thread.Sleep(120000); 
    //if(txtStatus.InvokeRequired) { 
    // txtStatus.Invoke(new MethodInvoker(delegate { txtStatus.Text="Thread started"; })); 
    //} 

    txtStatus.Text="sample"; 
} 

此代碼不能正常工作:我把這個作爲有證據表明線程沒有產生,就好像它然後txtStatus.Text="sample";會拋出一個異常....對吧?

那麼這裏發生了什麼?爲什麼不是我的線程被創建?

回答

1

我的猜測是,因爲你拿出你的延遲,線程產卵,設定值,並關閉。

從錯誤的線程訪問txtStatus.Text不保證拋出,但。在某些情況下,您可以通過後臺線程訪問控件上的屬性,但不會拋出。 (但你仍然不應該這樣做)

如果你仍然相信線程沒有啓動,你可以嘗試在那裏設置一個斷點 - 我相當肯定你會發現它正在達到這一點。

1

後臺線程一般無法訪問UI線程創建的組件。我的建議是添加一個嘗試趕上ThreadJob,但最好的是使用BackgroundWorker而不是因爲它被設計爲直接訪問UI線程組件(以及使用看不見的魔術:-)

3

它不一定會有拋出異常。它可能有,但它可能再次失敗。有一個原因阻止跨線程UI訪問:這是片狀和危險的。總體而言,驗證您的程序的方式不是您認爲應該的方式。

使用斷點和調試器...

+0

或者一個Debug.WriteLine將出現在VS的輸出窗口中。 – Richard 2009-04-08 22:25:43

0

表單線程異常沒有被拋出是而不是你的線程沒有運行的良好證據。稍微好一點的方法來驗證你的線程運行:用Console.Out.WriteLine("sample")替換賦值,然後檢查你的控制檯輸出。

-1

你不應該使用ThreadStart對象嗎?

如:

Thread t = new Thread(new ThreadStart(ThreadJob)); 

我使用的ThreadStart和ParamatizedThreadStart對象沒有問題,所有的時間。你應該明確地不訪問在另一個線程中創建的UI對象,除非你禁用了這個異常,否則應該拋出它,正如你正確指出的那樣,如果你的上面的線程按預期工作。

David

相關問題