[小技巧]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)
        {
          
//
        }


    }
}

点击源代码下载





转载于:https://www.cnblogs.com/wujun/archive/2006/10/09/524602.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Winform中执行多线程任务时,可以使用BackgroundWorker来实现。BackgroundWorker是基于事件的异步模式(Event based Asynchronous Pattern,EAP)的一种实现。通过使用BackgroundWorker,可以在任务执行过程中或执行完成后,通过ProgressChanged和RunWorkerCompleted事件进行线程安全的UI更新。\[1\] 在使用BackgroundWorker时,可以通过订阅RunWorkerCompleted事件来处理任务执行完成后的逻辑。例如,可以使用以下代码来订阅RunWorkerCompleted事件: ```csharp backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); ``` \[2\] 另外,如果在多线程任务中出现了线程间非安全操作异常,可以通过设置CheckForIllegalCrossThreadCalls属性来指示是否捕获该异常。默认情况下,CheckForIllegalCrossThreadCalls属性的值为true,即线程间非安全操作会抛出异常。如果将该属性设置为false,可以简单地屏蔽该异常。\[3\] 总结来说,要在Winform中执行队列多线程任务,可以使用BackgroundWorker来实现异步任务,并通过订阅RunWorkerCompleted事件来处理任务执行完成后的逻辑。同时,可以通过设置CheckForIllegalCrossThreadCalls属性来控制是否捕获线程间非安全操作异常。 #### 引用[.reference_title] - *1* *2* *3* [C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)](https://blog.csdn.net/weixin_39598069/article/details/114307383)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值