C#InvalidOperationException与跨线程操作在我的windows窗体中,我有一个文本框和一个按钮,文本框“tb_LogBox”是一个多行文本框,我正在尝试创建一个在编译和运行时应该调用“LogTimer.DnT()”函数的后台工作者VisualStudio抛出InvalidOperationException。我得到的实际错误是Invalidcross-threadoperation:Control'tb_LogBox'accessedfromathreadotherthanthethreadiscreatedon.以下示例代码说明了我正在尝试执行的操作privatevoidbutton1_Click(objectsender,EventArgse){bw.DoWork+=执行操作;bw.RunWorkerAsync();}catch(Exceptionex){tb_LogBox.AppendText(Environment.NewLine+"=@="+ex.Message+""+ex.Source);}}privatevoidExecuteOperations(objectsender,DoWorkEventArgse){varFuncCall=newLogTimer();tb_LogBox.AppendText(Environment.NewLine+FuncCall.DnT());//我得到错误的行。on}publicclassLogTimer{publicstringDnT(){conststringdatePat=@"d/MM/yyyy";vardateTime=DateTime.Now();返回dateTime.ToString(datePat);}}尝试使用开始调用方法:BeginInvoke(newAction(()=>{tb_LogBox.AppendText(Environment.NewLine+FuncCall.DnT());}));这比Invoke更流畅。您需要将Ui更改编组到UI线程。这可以通过在Winforms应用程序中使用围绕tb_LogBox.AppendText的invoke/begininvoke调用来执行:在WPF应用程序中:this.Dispatcher.BeginInvoke((Action)delegate(){tb_LogBox.AppendText(Environment.NewLine+FuncCall.DatenTime());});希望这可以帮助!在ExecuteOperations中执行此操作:tb_LogBox.Invoke((MethodInvoker)delegate(){tb_LogBox.AppendText(...)}));您不能使用其他线程(BackgroundWorker使用.NET线程池线程)来更改UI组件。这是您在WinForms编程中习惯的主要障碍。您需要在UI线程上调用控件的方法:privatevoidExecuteOperations(objectsender,DoWorkEventArgse){varFuncCall=newLogTimer();tb_LogBox.Invoke((MethodInvoker)delegate{tb_LogBox.AppendText(Environment.NewLine+FuncCall.DatenTime());});}我不知道LogTimer的作用,但很可能你应该在委托中创建它:.AppendText(Environment.NewLine+FuncCall.DatenTime());});BackgroundWorker在它自己的线程上执行,与WinFormsGUI元素相关的所有操作都必须在创建它们的线程上运行。他们目前使用BackgroundWorker的方式与使用ThreadPool.QueueUserWorkItem()对操作进行排队的方式相同。要使用BackgroundWorker回发到GUI,请使用ReportProgess或在辅助方法中设置DoWorkEventArgs.Result属性并对GUI线程上的相应事件做出反应。您还可以在WinForms控件上使用Invoke/BeginInvoke直接在GUI线程上执行任意代码。在你的情况下,这意味着替换访问tb_LogBox的行:tb_LogBox.Invoke(newAction(()=>tb_LogBox.AppendText(Environment.NewLine+FuncCall.DatenTime());));您不能在后台工作程序的执行线程访问主机线程。您可以使用BackgroundWorker的ReportProgress方法向宿主线程发送信息。以上就是C#学习教程的全部内容:C#InvalidOperationException与跨线程操作分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注—privatevoidbutton1_Click(objectsender,EventArgse){try{varbw=newBackgroundWorker();bw.DoWork+=执行操作;bw.ProgressChanged+=bw_ProgressChanged;bw.RunWorkerAsync();}catch(Exceptionex){tb_LogBox.AppendText(Environment.NewLine+"=@="+ex.Message+""+ex.Source);}}privatestaticvoidExecuteOperations(objectsender,DoWorkEventArgse){varFuncCall=newLogTimer();字符串文本=Environment.NewLine+FuncCall.DnT();(发件人作为BackgroundWorker)。ReportProgress(0,文本);}privatevoidbw_ProgressChanged(objectsender,ProgressChangedEventArgse){tb_LogBox.AppendText(e.UserStateasstring);}publicclassLogTimer{publicstringDnT(){conststringdatePat=@"d/MM/yyyy";vardateTime=DateTime.Now;返回dateTime.ToString(datePat);}}本文收集自网络,不代表立场。及侵权请点击维权联系管理员删除如需转载请注明出处:
