Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
CODE PROJECT For Those Who Code
  • Home
  • Articles
  • FAQ
Community
  1. Home
  2. General Programming
  3. C#
  4. Illegal cross thread exception in Invoke method

Illegal cross thread exception in Invoke method

Scheduled Pinned Locked Moved C#
csharphelptutorialquestion
18 Posts 5 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A AspDotNetDev

    FYI, that would prevent a locking situation, but would not likely prevent a cross-thread exception. It would also change the flow of the program (i.e., the call would be asynchronous rather than blocking), which the OP may not want.

    [Forum Guidelines]

    L Offline
    L Offline
    Luc Pattyn
    wrote on last edited by
    #8

    I agree. :)

    Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]


    I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that.


    1 Reply Last reply
    0
    • A AspDotNetDev

      FYI, this is what code looks like when you wrap it in PRE tags and specify C# for the LANG attribute, as Luc mentioned:

      // Delegate:
      private delegate void ChangeTextDelegate(string text);

      // Method:
      public static void ChangeText(string text)
      {
      if (richtextbox1.InvokeRequired)
      {
      richtextbox1.Invoke(new ChangeTextDelegate(ChangeText), new object[] { text });
      }
      else
      {
      int startIndex;
      startIndex = richtextbox1.TextLength; // <- Exception points here.
      // ...
      }
      }

      Not sure why you are getting an exception there (perhaps post a screenshot and the full text of the exception?), but you might try the following to see if it works (changes in bold):

      // Delegate:
      private delegate void ChangeTextDelegate(string text);

      // Method:
      public static void ChangeText(string text)
      {
      if (this.InvokeRequired)
      {
      this.Invoke(new ChangeTextDelegate(ChangeText), new object[] { text });
      }
      else
      {
      int startIndex;
      startIndex = richtextbox1.TextLength; // <- Exception points here.
      // ...
      }
      }

      FYI, here is what I typed to make the code look like it does above:

      <pre lang="C#">// Delegate:
      private delegate void ChangeTextDelegate(string text);

      // Method:
      public static void ChangeText(string text)
      {
      if (<b><big><big><u>this</u></big></big></b>.InvokeRequired)
      {
      <b><big><big><u>this</u></big></big></b>.Invoke(new ChangeTextDelegate(ChangeText), new object[] { text });
      }
      else
      {
      int startIndex;
      startIndex = richtextbox1.TextLength; // <- Exception points here.
      // ...
      }
      }</pre>

      [Forum Guidelines]

      Y Offline
      Y Offline
      yeah1000
      wrote on last edited by
      #9

      Here is the stack trace, perhaps it can help clarify the problem...

      System.InvalidOperationException was unhandled
      Message="Cross-thread operation not valid: Control 'SomeClass' accessed from a thread other than the thread it was created on."
      Source="System.Windows.Forms"
      StackTrace:
      at System.Windows.Forms.Control.get_Handle()
      at System.Windows.Forms.Control.get_InternalHandle()
      at System.Windows.Forms.Control.WmWindowPosChanged(Message& m)
      at System.Windows.Forms.Control.WndProc(Message& m)
      at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
      at System.Windows.Forms.RichTextBox.WndProc(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
      at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
      at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
      at System.Windows.Forms.Control.DefWndProc(Message& m)
      at System.Windows.Forms.Control.WmCreate(Message& m)
      at System.Windows.Forms.Control.WndProc(Message& m)
      at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
      at System.Windows.Forms.RichTextBox.WndProc(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
      at System.Windows.Forms.UnsafeNativeMethods.IntCreateWindowEx(Int32 dwExStyle, String lpszClassName, String lpszWindowName, Int32 style, Int32 x, Int32 y, Int32 width, Int32 height, HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, Object pvParam)
      at System.Windows.Forms.UnsafeNativeMethods.CreateWindowEx(Int32 dwExStyle, String lpszClassName, String lpszWindowName, Int32 style, Int32 x, Int32 y, Int32 width, Int32 height, HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, Object pvParam)
      at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
      at System.Windows.Forms.Control.CreateHandle()
      at System.Windows.Forms.TextBoxBase.CreateHandle()
      at System.Windows.Forms.Control.get_Handle()
      at System.Windows.Forms.Ric

      1 Reply Last reply
      0
      • A AspDotNetDev

        FYI, this is what code looks like when you wrap it in PRE tags and specify C# for the LANG attribute, as Luc mentioned:

        // Delegate:
        private delegate void ChangeTextDelegate(string text);

        // Method:
        public static void ChangeText(string text)
        {
        if (richtextbox1.InvokeRequired)
        {
        richtextbox1.Invoke(new ChangeTextDelegate(ChangeText), new object[] { text });
        }
        else
        {
        int startIndex;
        startIndex = richtextbox1.TextLength; // <- Exception points here.
        // ...
        }
        }

        Not sure why you are getting an exception there (perhaps post a screenshot and the full text of the exception?), but you might try the following to see if it works (changes in bold):

        // Delegate:
        private delegate void ChangeTextDelegate(string text);

        // Method:
        public static void ChangeText(string text)
        {
        if (this.InvokeRequired)
        {
        this.Invoke(new ChangeTextDelegate(ChangeText), new object[] { text });
        }
        else
        {
        int startIndex;
        startIndex = richtextbox1.TextLength; // <- Exception points here.
        // ...
        }
        }

        FYI, here is what I typed to make the code look like it does above:

        <pre lang="C#">// Delegate:
        private delegate void ChangeTextDelegate(string text);

        // Method:
        public static void ChangeText(string text)
        {
        if (<b><big><big><u>this</u></big></big></b>.InvokeRequired)
        {
        <b><big><big><u>this</u></big></big></b>.Invoke(new ChangeTextDelegate(ChangeText), new object[] { text });
        }
        else
        {
        int startIndex;
        startIndex = richtextbox1.TextLength; // <- Exception points here.
        // ...
        }
        }</pre>

        [Forum Guidelines]

        Y Offline
        Y Offline
        yeah1000
        wrote on last edited by
        #10

        Soo, any ideas? :)

        A 1 Reply Last reply
        0
        • Y yeah1000

          Soo, any ideas? :)

          A Offline
          A Offline
          AspDotNetDev
          wrote on last edited by
          #11

          I assume you already tried using the "this" keyword like I said above? If that doesn't work, you can take two approaches. With one approach, try to create the error with a very small tester form. Then, post that here for us to review. Or, try removing code from your project little by little until it starts working.

          [Forum Guidelines]

          Y 1 Reply Last reply
          0
          • A AspDotNetDev

            I assume you already tried using the "this" keyword like I said above? If that doesn't work, you can take two approaches. With one approach, try to create the error with a very small tester form. Then, post that here for us to review. Or, try removing code from your project little by little until it starts working.

            [Forum Guidelines]

            Y Offline
            Y Offline
            yeah1000
            wrote on last edited by
            #12

            I am currently testing it with the 'this' keyword. But why should this approach solve the problem? What are the technicalities behind it? :)

            A 1 Reply Last reply
            0
            • Y yeah1000

              I am currently testing it with the 'this' keyword. But why should this approach solve the problem? What are the technicalities behind it? :)

              A Offline
              A Offline
              AspDotNetDev
              wrote on last edited by
              #13

              Was just a wild guess really. Not sure if it would help.

              [Forum Guidelines]

              Y 1 Reply Last reply
              0
              • A AspDotNetDev

                Was just a wild guess really. Not sure if it would help.

                [Forum Guidelines]

                Y Offline
                Y Offline
                yeah1000
                wrote on last edited by
                #14

                Okay, that didn't help :( Any more ideas?

                A 1 Reply Last reply
                0
                • Y yeah1000

                  Okay, that didn't help :( Any more ideas?

                  A Offline
                  A Offline
                  AspDotNetDev
                  wrote on last edited by
                  #15

                  Show me the exact code that causes the problem. Create as small of a tester application as you can and paste ALL of the code for it (but remember to try and make the example concise). It's probably something simple, but I can't help you unless I see the code you are using.

                  [Forum Guidelines]

                  Y 1 Reply Last reply
                  0
                  • A AspDotNetDev

                    Show me the exact code that causes the problem. Create as small of a tester application as you can and paste ALL of the code for it (but remember to try and make the example concise). It's probably something simple, but I can't help you unless I see the code you are using.

                    [Forum Guidelines]

                    Y Offline
                    Y Offline
                    yeah1000
                    wrote on last edited by
                    #16

                    I was finally able to fix the problem: Apparently the handle for the richtextbox did not exist when i tried to invoke it. Since i used it in a background thread, the invokerequired property returned 'false', sometimes causing it to display the illegal cross thread operation exception (suring program startup). The solution was to use the Form_load event which would signal the background thread when it was fully loaded. But its still a bit unclear how such a thing can happen. When does actually InitializeComponent return? When can i be sure that the control handles exist?

                    A 1 Reply Last reply
                    0
                    • Y yeah1000

                      I was finally able to fix the problem: Apparently the handle for the richtextbox did not exist when i tried to invoke it. Since i used it in a background thread, the invokerequired property returned 'false', sometimes causing it to display the illegal cross thread operation exception (suring program startup). The solution was to use the Form_load event which would signal the background thread when it was fully loaded. But its still a bit unclear how such a thing can happen. When does actually InitializeComponent return? When can i be sure that the control handles exist?

                      A Offline
                      A Offline
                      AspDotNetDev
                      wrote on last edited by
                      #17

                      Glad to hear you got it working. :) InitializeComponent should be called from the constructor. You should only reference controls after that call to InitializeComponent.

                      [Forum Guidelines]

                      Y 1 Reply Last reply
                      0
                      • A AspDotNetDev

                        Glad to hear you got it working. :) InitializeComponent should be called from the constructor. You should only reference controls after that call to InitializeComponent.

                        [Forum Guidelines]

                        Y Offline
                        Y Offline
                        yeah1000
                        wrote on last edited by
                        #18

                        Oh but i did call it from the constructor, then started the background thread and inside that thread tried to access the controls.

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • World
                        • Users
                        • Groups