【问题标题】:Illegal cross thread operation exception, unable to handle it非法跨线程操作异常,无法处理
【发布时间】:2012-07-02 21:45:37
【问题描述】:

我正在使用 Visual C# express 2008。当我尝试运行我的项目时,我有时会在我的调用方法中得到非法的跨线程操作。它在许多地方使用相同的调用方法,但仅在另一个线程的开头我得到错误。我检查 InvokeRequired 属性,在“else”条件下调用相同的方法并创建一个临时变量并将其分配给我的控件的文本。但是在那条线上,在“else”语句中,在 Invoking 方法中,我有时会遇到异常。可能是什么原因?如何摆脱它?它不经常发生,但它仍然是一个错误。

代码:

// 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.
        // ...
    }
}

堆栈跟踪:

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.RichTextBox.get_TextLength()
       at SomeNamespace.SomeClass.Changetext(String text, Color color) in C:\...\SomeClass.cs:line 827
       at SomeNamespace.SomeClass.SomeThreadFun() in C:\...\SomeClass.cs:line 112
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

TY

【问题讨论】:

标签: c# multithreading


【解决方案1】:

问题似乎是您正试图从非 UI 线程访问 Windows 控件属性。相反,请尝试使用 Invoke 从控件中获取文本长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2012-08-09
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多