线程间操作无效: 从不是创建控件“textBox2”的线程访问它。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread oThread = new Thread(new ThreadStart(Gethttp));
oThread.Start();
}
private void Gethttp()
{
WebRequest request = WebRequest.Create("aspx?AppId=434097AB350E29EED406F35E8364181516BCA5FC&Query=ip">http://api.bing.net/xml.aspx?AppId=434097AB350E29EED406F35E8364181516BCA5FC&Query=ip:" + textBox1.Text + "&Verstion=2.0&Market=zh-CN&Sources=web+spell&web.count=50&web.offset=0");//WebRequest.Create方法,返回WebRequest的子类HttpWebRequest
WebResponse response = request.GetResponse(); //WebRequest.GetResponse方法,返回对 Internet 请求的响应
Stream resStream = response.GetResponseStream(); //WebResponse.GetResponseStream 方法,从 Internet 资源返回数据流。
Encoding enc = Encoding.GetEncoding("utf-8"); // 如果是乱码就改成 utf-8 / GB2312
StreamReader sr = new StreamReader(resStream, enc); //命名空间:System.IO。 StreamReader 类实现一个 TextReader (TextReader类,表示可读取连续字符系列的读取器),使其以一种特定的编码从字节流中读取字符。
textBox2.Text = sr.ReadToEnd();
resStream.Close();
sr.Close();
}
}
}
运行后出错如图
线程间操作无效: 从不是创建控件“textBox2”的线程访问它。
解决方法有两种,但是推荐第二种方法:www.2cto.com
1、
Control.CheckForIllegalCrossThreadCalls = false;
线程开始的时候加这么一句,OK,看不到错误了~
2、
因为你这个控件是主线程创建的,它依附于创建窗体的主线程.因此,要在子线程去访问占资源的类型,我们需要跨线程调用.textBox2.InvokeRequire用于判断是否需要跨线程,返回True为需要跨线程,此时你需要定义一个委托类来将一个含赋值语句的方法封装起来,通过textBox2.Invoke来调用这个委托.代码如下:
public delegate void SetTextHandler(string text);
private void SetText(string text)
{
if(textBox4.InvokeRequired==true)
{
SetTextHandler set=new SetTextHandler(SetText);//委托的方法参数应和SetText一致
textBox2.Invoke(set,new object[]{text}); //此方法第二参数用于传入方法,代替形参text
}
else
{
textBox2.Text=text;
}
}
那么Gethttp函数可以改写成:
WebRequest request = WebRequest.Create(textBox1.Text);//WebRequest.Create方法,返回WebRequest的子类HttpWebRequest
WebResponse response = request.GetResponse(); //WebRequest.GetResponse方法,返回对 Internet 请求的响应
Stream resStream = response.GetResponseStream(); //WebResponse.GetResponseStream 方法,从 Internet 资源返回数据流。
Encoding enc = Encoding.GetEncoding("utf-8"); // 如果是乱码就改成 utf-8 / GB2312
StreamReader sr = new StreamReader(resStream, enc); //命名空间:System.IO。 StreamReader 类实现一个 TextReader (TextReader类,表示可读取连续字符系列的读取器),使其以一种特定的编码从字节流中读取字符。
SetText(sr.ReadToEnd().ToString());
resStream.Close();
sr.Close();
注意那句 SetText(sr.ReadToEnd().ToString()); 是主要要修改的地方
摘自 Shine的圣天堂-〃敏〃
相关新闻>>
- FormView显示、更新、插入、删除数据库操作[ASP.NET源代码](一)
- FormView显示、更新、插入、删除数据库操作[ASP.NET源代码](二)
- FormView显示、更新、插入、删除数据库操作[ASP.NET源代码](三)
- .NET(C#):线程安全集合的阻塞BlockingCollection的使用
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程
- 一个可移植数据库操作组件的简单介绍
- asp.net中操作excel等不存在类型或命名空间名称Office
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程
- 发表评论
-
- 最新评论 更多>>