2010-06-23 48 views
4

我不是(有意)在我的C#應用​​程序中使用線程。事實上,我的主要方法有一個[STAThread],我認爲這意味着我只能使用一個線程。爲什麼一個控件與我正在使用的控件不同?

爲什麼然後,我會得到這個錯誤信息?

跨線程操作無效:控制從其創建的線程以外的線程訪問的'messageLog'。

回答

6

有幾種類型可以導致您的代碼在不同的線程上運行,而不需要任何明確的調用System.Threading。特別想到FileSystemWatcherBackgroundWorker。你在使用這些類型嗎?

另外STAThread決不會限制你的進程產生線程的能力。它改爲設置初始應用程序線程的COM公寓類型。

+1

System.Timers.Timer是另一個 – nos 2010-06-23 23:51:22

+0

@Nos我正在使用計時器 - 我想這就是它造成的。 – 2010-06-24 00:07:33

+3

使用System.Windows.Forms.Timer如果這是一個winfoms應用程序,它會將計時器事件分派給GUI線程。 – nos 2010-06-24 00:20:11

2

[STAThread]標記main方法並不意味着你不能產生額外的線程。

你並沒有真正提供任何有關觸發代碼的信息,所以我不能更具體,但是無論何時執行異步代碼,它都會發生在另一個線程上。在代理上執行類似BeginInvoke的事情(或者,對於這個問題,大多數以Begin開頭的方法 - 當然,如果它們返回IAsyncResult - 則是異步方法)將在另一個線程上執行代碼(和回調)。

如果您可以提供更多關於您的情況的詳細信息,我可以嘗試提供更具體的建議。

0

[STAThread]並不表示您的應用程序將是單線程的。它只是表示應用程序將使用線程方式,以允許其他線程在特定線程正在等待耗時操作完成時執行。

至於爲什麼會引發跨線程異常,需要更多的上下文。 messageLog是什麼類型的控件?什麼代碼訪問此控件?您是否使用隱式使用線程的其他控件(例如BackgroundWorker)?

相關問題