理论上来说,多线程的情况下,副线程对于界面UI控件的访问是需要通过写委托,交给主线程,也就是UI线程来实现的。
    但是我实际编码过程中,我发现,如果在副线程中写委托而直接方位UI控件,这种情况下,在VS的调试模式下,会提示无法在非创建UI的线程中访问UI资源。但是,如果不是通过VS来调试,而是直接在debug文件夹下双击EXE文件执行的话,程序是可以正常执行的。
    虽说这种违规的操作带来了很大的危险性,但是毕竟在控制好访问时机的情况下,是可行的(虽然很难控制就是了)。
    请哪位大牛,能够解释下原因:为什么系统会允许跨线程访问UI资源。

解决方案 »

  1.   

    原因很简单,就因为你是调试状态,VS的调试器能够捕获并抛出InvalidOperationException异常.你可以尝试一下,在VS调试以及单独执行Debug程序下显示一下
    Debugger的IsAttached属性,比如设置Form的Text为this.Text = System.Diagnostics.Debugger.IsAttached.ToString();你会发现,VS调试状态下this.Text="True",直接运行Debug程序则是this.Text="False"建议你如果在线程中要操作UI元素,用Control.Invoke
      

  2.   

    当您在 Visual Studio 调试器中运行代码时,如果您从一个线程访问某个 UI 元素,而该线程不是创建该 UI 元素时所在的线程,则会引发 InvalidOperationException。调试器引发该异常以警告您存在危险的编程操作。UI 元素不是线程安全的,所以只应在创建它们的线程上进行访问
    创建窗体之后的线程成为UI线程,拥有消息循环,因此与普通线程相比,它是“特殊”的