C#学习教程:跨线程操作在Windows窗体中不工作比创建它的线程。这是我正在使用的代码:privatevoidDoWork(objecto){varlist=ListBox3;varrequest=createRequest(TxtServer.Text,WebRequestMethods.Ftp.ListDirectory);使用(varresponse=(FtpWebResponse)request.GetResponse()){使用(varstream=response.GetResponseStream()){使用(varreader=newStreamReader(stream,true)){while(!reader.EndOfStream){list.Items.Add(阅读器.ReadLine());ResultLabel.Text="已连接";}}}}}你需要调用委托来更新列表。请参阅此MSDN示例。您可以通过执行此操作来访问控件Invoke(newAction(()=>{Foo.Text="Hi";}));您不能从单独的线程访问控件,它必须来自创建控件的同一线程。这种扩展方法也解决了这个问题。//////允许UI组件的线程安全更新///publicstaticvoidInvokeEx(thisT@this,Actionaction)whereT:ISynchronizeInvoke{if(@this.InvokeRequired){@this.Invoke(action,new对象[]{@this});}else{动作(@this);在你的工作线程中使用这样的InvokeEx(x=>x.MyControl.Text="foo");您还可以使用以下语法通过调用它来访问控件,并使用Action委托:Invoke((Action)(()=>{varmyVar=SomeWinFormControl.Property;}));我假设DoWork是在另一个线程上启动的。该代码访问ListBox3,它是一个GUI控件。.NET将对GUI控件的访问限制为创建它们的线程。您可以这样做,因为从UI线程外部访问控件需要调用。当您开始时(我假设您使用BackgroundWorker),将文本框中的url作为参数传递给RunWorkerAsync(TxtServer.Text),然后:privatevoidDoWork(objecto,DoWorkEventArgse){争论;列表tmpList=新列表;varrequest=createRequest(url,WebRequestMethods.Ftp.ListDirectory);使用(varresponse=(FtpWebResponse)request.GetResponse()){使用(varstream=response.GetResponseStream()){使用(varreader=newStreamReader(stream,true)){while(!reader.EndOfStream){list.Add(阅读器.ReadLine());//ResultLabel.Text="已连接";//改用reportprogress()}}}}e.result=tmpList;然后在您的Completed事件中,将e.result转换为列表并将其添加到您的控件中。以上就是C#学习教程的全部内容:跨线程操作在WindowsForms中是无效的。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
