C# 多线程 异步加载 窗体

C# 多线程 异步加载 窗体

CheckForIllegalCrossThreadCalls = false; 让程序不检测跨线程更新控件

我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗体加载的时候,会进行其他的操作:

1.若是在加载之前,操作---》整个界面出来的很慢,而且若是时间长的话,页面很久才能出来,

2.若是写在加载之后处理的话,虽然界面出来了,这个时候,出现了假死的状体。但是不能乱点,一点,就有卡死的现象。

现在我们利用异步,和多线程来控制,并且加上进度条。来做一个界面加载的时候出现很大操作。

示例:

using System.Windows.Forms;
using System.Threading;
using System;

namespace Threaddemo1{

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    delegate void aa(string s);//创建一个代理

    private void Form1_Load(object sender, EventArgs e){

    Thread newthread = new Thread(new ThreadStart(ttread));
        newthread.Start();
    }

    void ttread(){
        pri("77");
    }

    private delegate void ProgressBarShow(int i);

    private void pri(string p){

        bool name = richTextBox1.InvokeRequired;

        //MessageBox.Show(name.ToString());

        if (!richTextBox1.InvokeRequired){//判断是否需要进行唤醒的请求,如果控件与主线程在一个线程内,可以写成if(!InvokeRequired)

    Loadthread();

   } else {

// MessageBox.Show("不是同一个线程");

aa a1 = new aa(pri);

Invoke(a1, new object[] { p });//执行唤醒操作

}

}


private void Loadthread(){
    string s = string.Empty;
    for (int b = 0; b < 10000; b++){
        this.ShowPro(b);
        s += b.ToString();
    }
    //MessageBox.Show("同一线程内");
    LoadRichebox(s);
}

void send() {
    Thread.CurrentThread.Abort();
}

private void LoadRichebox(string s)

{

richTextBox1.Text = s;

}

private void ShowPro(int value)

{

if (this.InvokeRequired)

{

this.Invoke(new ProgressBarShow(ShowPro), value);

}

else

{

this.progressBar1.Value = value;

this.label1.Text = value + "% Processing...";

}

}

}

}


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值