在winform中使用多线程 并跨线程操作按钮及文本框

来源:互联网 发布:json解析网页 编辑:程序博客网 时间:2024/06/01 03:58

 继续贴吧江湖的项目

在利用前面的socket Http Get 和Post 已经可以成功登陆论坛

但是在socket中读取HTML代码速度让我很难受

所以在form类中创建新的线程来操作socket 然后在窗口中放了一个滚动条 感觉满好看的  vista启动画面那种

 

Run()方法是调用以及操作socket的方法 就是准备在新线程中执行的方法 也就是俗称耗时的方法

 

在成员变量中定义线程 以及 回掉委托 :

  1.   private Thread th = null;//定义线程
  2.         delegate void SetTextCallback(string text);//定义一个包含参数的委托
  3.         delegate void f(); //定义一个用作跨线程操作窗体控件的委托

定义两个委托是 一个对文本框操作 一个对按钮操作

 

事件触发代码

 

  1.   private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             progressBar1.Style = ProgressBarStyle.Marquee;
  4.             th = new Thread(new ThreadStart(Run));
  5.             th.Start();
  6.             //progressBar1.Style = ProgressBarStyle.Blocks;
  7.          }

下面几个方法是在新线程中对窗体原创线程利用委托来进行回调请求

以及原线程收到请求后做的事情

 

  1.  private void SetText(string text)//跨线程操作窗体 改变文本框内容
  2.         {
  3.             if (this.richTextBox1.InvokeRequired)
  4.             {
  5.                 SetTextCallback d = new SetTextCallback(SetText);
  6.                 this.Invoke(d, new object[] { text });
  7.             }
  8.             else
  9.             {
  10.                 this.richTextBox1.Text = text;
  11.             }
  12.         }
  13.        
  14.         private void LoginButton()//请求窗体创建线程将按钮1设置为false
  15.         {
  16.             button1.Enabled = !button1.Enabled;
  17.             
  18.            
  19.         }
  20.       
  21.         private void UiCon(f objf)//跨线程操作窗体控件,参数为定义的委托类对象
  22.         {
  23.             Invoke(objf); 
  24.         }
  25.         private void ProgBar()//请求窗体创建线程将滚动条设置为Blocks
  26.         {
  27.             progressBar1.Style = ProgressBarStyle.Blocks;
  28.         }

新线程方法中对回掉请求的调用

 

  1. UiCon(new f(ProgBar));
  2. SetText(Html);
  3. UiCon( new f(LoginButton));

SetText方法的实现过程与UiCon本质是一样的

 

SetText方法多了一个判断当前线程是否为窗体创建线程

 

UiCon只是方便我减少代码量而做了一个传递委托对象并调用的方法

 

大概就这些

 

还有更简单的那个BackGroundWorker类可以达到这样的功能

 

不过那个是控件

 

还是喜欢对底层的一些东西来操作 所以没有理会

  1.