2011-05-12 75 views
1

嗨,大家好,我遇到了一個非常奇怪的錯誤。我有一個程序需要在啓動時運行一個線程,並且由於某種原因,當我在Form1()中執行myThread.Start()時,它會因「程序無法工作」而崩潰(但只在Windows Server上,而不在本地機器上!)。但是,如果我將相同的代碼放在button1_Start()之下,它沒有問題。是什麼賦予了?Windows Server 2008上的Form1()崩潰程序中的線程啓動

任何想法? 謝謝。

編輯 一些額外的信息:在我的線程我有一個行的代碼,使用調用

Invoke(new Action(() => richTextBox1.AppendText(string.Format("Updating {0}..\n", DateTime.Now)))); 

,由於某種原因轟然消失後,我做了2秒線程睡眠開始之前執行。我是否使用正確的方法在應用程序啓動時執行代碼?

+1

線程是做什麼的? – 2011-05-12 21:49:18

+0

你正在訪問你的線程中的一些資源?如果是這樣,資源的類型是什麼? – Adi 2011-05-12 21:50:16

+0

當你說*在button1_Start *下放置相同的代碼時,你的意思是將線程的開始移動到該方法,還是將線程的內容移動到該方法。您如何向我們展示窗體構造函數,線程中的代碼以及button1_Start的外觀?即。向我們展示代碼? – 2011-05-12 21:53:04

回答

2

請注意,這是一個猜測,在您的問題中,您沒有給出足夠的信息來給出任何確定的答案。

我懷疑它與Windows Server 2008有什麼關係,但可能更多是因爲服務器擁有比開發機器更多的CPU內核和/或更快的處理器。

如果您在線程嘗試通過變量訪問表單,或者您嘗試返回擁有該表單的線程,則會在快速計算機上崩潰。

爲什麼?

在第一種情況下,變量尚未設置。下面的代碼:

var fm = new Form1(); 

這裏,fm不會在構造函數返回之前設置。如果你的線程已經試圖通過fm訪問表單,該變量是null

在第二種情況下,構造函數不負責顯示錶單,這是後來發生的。許多控件推遲實際分配一個句柄,直到他們被要求畫出自己,因此如果線程試圖在控件之前做一些東西,它會崩潰。

你應該從開始你的線程。

+0

這就是錢!我只是把代碼扔到Form_Load中,它完美地工作。尼斯=) – Rob 2011-05-12 22:02:40

0

在我們公司,我們對產生使用COM的位圖異步加載的應用程序有相同的症狀 - 僅在W2008上。

的問題竟然是:

  • 我們使用來自該線程的COM對象(這是STA)
  • 僅在對象的W2008初始化時間
  • 開始線程無法完成在COM前的工作準備,並得到錯誤

我不知道爲什麼只對W2008,但我們的黑客是線程開始從構造移動到實際點,其中t他需要線程工作。