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, 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