为什么控件与我正在工作的控件不同?

时间:2010-06-23 23:43:04

标签: c# multithreading

我不是(故意)在我的C#应用​​程序中使用线程。实际上我的主要方法有[STAThread],我认为这意味着我只使用一个帖子。

为什么然后,我会收到此错误消息吗?

  

跨线程操作无效:控制'messageLog'从其创建的线程以外的线程访问。

3 个答案:

答案 0 :(得分:6)

有几种类型可以导致代码在不同的线程上运行,而无需显式调用System.Threading。特别是FileSystemWatcherBackgroundWorker会浮现在脑海中。你使用这些类型中的任何一种吗?

同样STAThread决不会限制进程生成线程的能力。它改为设置初始应用程序线程的COM单元类型。

答案 1 :(得分:2)

使用main标记[STAThread]方法并不意味着您无法生成其他线程。

您实际上并未提供有关触发代码的内容的任何信息,因此我不能更具体,但是每次执行异步代码时都会在另一个线程上执行。在委托上执行BeginInvoke之类的事情(或者,对于这个问题,大多数以Begin开头的方法 - 当然,如果它们返回IAsyncResult - 是异步方法)将执行另一个线程上的代码(和回调)。

如果您可以提供有关您情况的更多详细信息,我可以尝试提供更具体的建议。

答案 2 :(得分:0)

[STAThread]并不表示您的应用程序是单线程的。它仅表示应用程序将使用线程,允许其他线程在特定线程等待耗时的操作完成时执行。

至于为什么抛出交叉线程异常,需要更多的上下文。 messageLog是什么类型的控件?什么代码访问此控件?您是否正在使用隐式使用线程的任何其他控件(例如BackgroundWorker)?