[小技巧]winfrom使用多线程

就拿我写的备份新浪博客的小程序说。。当我点备份按钮的时候,如果不用线程。。那窗体可能就会假死在那,一动不动的。给用户感觉很不爽的。。那要怎么解决呢??

你可能会觉的这个很简单。几行代码就搞定。

定义个方法
public   void  MyTest()
        {
            
for  ( int  i  =   0 ; i  <   100 ; i ++ )
            {
                
this .textBox1.Text  =  i.ToString();
            }
        }

private   void  button1_Click( object  sender, EventArgs e)
        {
            Thread myThread 
=   new  Thread(MyTest);
            myThread.Start();
        }


很遗憾。

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll

Additional information: 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。



问题解决:

1.定义 委托
   delegate   void  myDelegate( int  i);
   myDelegate mydelegate 
=   null ;

2.定义方法,显示消息

public   void  ShowMessage( int  i)
        {
            
this .textBox1.Text  =  i.ToString();
            
this .progressBar1.Value  =  i;
        }



3.定义方法,驱动消息

public   void  MyEvent()
        {
            
for  ( int  i  =   0 ; i  <   100 ; i ++ )
            {
                Thread.Sleep(
100 );
                
this .BeginInvoke(mydelegate,  new   object [] {i});
            
            }
        }



4: 运行
  private   void  button1_Click( object  sender, EventArgs e)
        {
            mydelegate 
=   new  myDelegate(ShowMessage);
            Thread myThread 
=   new  Thread(MyEvent);

            
// IsBackground 是否后台
            
// 这个属性很重要 .如果 Thread IsBackground 等于false
            
//  当线程还没有结束时,你点了关闭按钮
            
//  将抛出An unhandled exception
            
// of type 'System.InvalidOperationException'
            
// occurred in System.Windows.Forms.dll 异常
            myThread.IsBackground  =   true ;
            myThread.Start();
        }



全都代码:

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;

using  System.Threading;


namespace  WinfromTheadTest
{
    
public  partial  class  Form1 : Form
    {
        
delegate   void  myDelegate( int  i);
        myDelegate mydelegate 
=   null ;


        
public  Form1()
        {
            InitializeComponent();
        }

       
        
private   void  button1_Click( object  sender, EventArgs e)
        {
            mydelegate 
=   new  myDelegate(ShowMessage);
            Thread myThread 
=   new  Thread(MyEvent);

            
// IsBackground 是否后台
            
// 这个属性很重要 .如果 Thread IsBackground 等于false
            
//  当线程还没有结束时,你点了关闭按钮
            
//  将抛出An unhandled exception
            
// of type 'System.InvalidOperationException'
            
// occurred in System.Windows.Forms.dll 异常
            myThread.IsBackground  =   true ;
            myThread.Start();
        }

        
public   void  ShowMessage( int  i)
        {
            
this .textBox1.Text  =  i.ToString();
            
this .progressBar1.Value  =  i;
        }

        
public   void  MyEvent()
        {
            
for  ( int  i  =   0 ; i  <   100 ; i ++ )
            {
                Thread.Sleep(
100 );
                
this .BeginInvoke(mydelegate,  new   object [] {i});
            
            }
        }

        
private   void  button2_Click( object  sender, EventArgs e)
        {
          
//
        }


    }
}

点击源代码下载





 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值