zoukankan      html  css  js  c++  java
  • 【转】线程间操作无效: 从不是创建控件“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("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”的线程访问它。 解决方法有两种,但是推荐第二种方法:

    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()); 是主要要修改的地方。

    其他网络解释:

    在.net中,控件的访问更新只能在"拥有"这个控件的线程上执行,否则回抛异常。

    MS在Control类上提供了一个InvokeRequired的属性。下面是MSDN对这个属性的一个注释。我这里只有中文版的。呜呜。

    Control.InvokeRequired 属性 获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。

    我查过英文版的注释,无论是中文的还是英文的,都强调了一点,就是说控件只能在创建此控件的线程上才能被调用。但是实际上却不是这样子的。

    正确地说,这里有两个概念,即创建控件的线程和拥有控件的线程。关于"拥有"这个词,这里只是我自己YY出来的,但愿能说明问题,后面还有更多的解释。

    创建控件的线程很好理解,那什么是拥有控件的线程呢。两者是一样的吗?不一样。

    拥有控件的线程。我这里指的应该是创建了此控件handle的线程,而不是创建控件本身的那个线程。两者可以是相同的,也可以是不同的。

    那线程怎么样创建一个控件的handle呢?很简单,我们还是先看看MSDN对Handle的说明。

    Control.Handle 属性

    获取控件绑定到的窗口句柄。 备注 Handle 属性的值是 Windows HWND。如果句柄尚未创建,引用该属性将强制创建句柄。

    在实际中,当一个控件被创建出来后,它的Handle是还没有被创建的,只有当第一次引用了该发生之后,才会被创建。

    http://bbs.csdn.net/topics/340026499

  • 相关阅读:
    实验5 编写调试有多个段的程序
    实验四 [bx]和 loop 的使用
    实验三
    实验二
    第一章
    汇编语言第二章知识梳理
    实验一:查看CPU和内存,用机器指令和汇编指令编程
    实验9
    实验5
    实验4:
  • 原文地址:https://www.cnblogs.com/summer_adai/p/3408828.html
Copyright © 2011-2022 走看看