2011-05-12 142 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他需要线程工作。