我不是(有意)在我的C#應用程序中使用線程。事實上,我的主要方法有一個[STAThread]
,我認爲這意味着我只能使用一個線程。爲什麼一個控件與我正在使用的控件不同?
爲什麼然後,我會得到這個錯誤信息?
跨線程操作無效:控制從其創建的線程以外的線程訪問的'messageLog'。
我不是(有意)在我的C#應用程序中使用線程。事實上,我的主要方法有一個[STAThread]
,我認爲這意味着我只能使用一個線程。爲什麼一個控件與我正在使用的控件不同?
爲什麼然後,我會得到這個錯誤信息?
跨線程操作無效:控制從其創建的線程以外的線程訪問的'messageLog'。
有幾種類型可以導致您的代碼在不同的線程上運行,而不需要任何明確的調用System.Threading
。特別想到FileSystemWatcher
和BackgroundWorker
。你在使用這些類型嗎?
另外STAThread
決不會限制你的進程產生線程的能力。它改爲設置初始應用程序線程的COM公寓類型。
用[STAThread]
標記main
方法並不意味着你不能產生額外的線程。
你並沒有真正提供任何有關觸發代碼的信息,所以我不能更具體,但是無論何時執行異步代碼,它都會發生在另一個線程上。在代理上執行類似BeginInvoke
的事情(或者,對於這個問題,大多數以Begin
開頭的方法 - 當然,如果它們返回IAsyncResult
- 則是異步方法)將在另一個線程上執行代碼(和回調)。
如果您可以提供更多關於您的情況的詳細信息,我可以嘗試提供更具體的建議。
[STAThread]
並不表示您的應用程序將是單線程的。它只是表示應用程序將使用線程方式,以允許其他線程在特定線程正在等待耗時操作完成時執行。
至於爲什麼會引發跨線程異常,需要更多的上下文。 messageLog是什麼類型的控件?什麼代碼訪問此控件?您是否使用隱式使用線程的其他控件(例如BackgroundWorker
)?
System.Timers.Timer是另一個 – nos 2010-06-23 23:51:22
@Nos我正在使用計時器 - 我想這就是它造成的。 – 2010-06-24 00:07:33
使用System.Windows.Forms.Timer如果這是一個winfoms應用程序,它會將計時器事件分派給GUI線程。 – nos 2010-06-24 00:20:11