winform开线程,避免页面假死

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.Data.SqlClient;
using System.Text.RegularExpressions;
using System.Threading;
using System.Globalization;
using System.Web;

namespace Redis_AddData
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            label1.Text = "";
        }
        int maxSize = 0;  //16753
        int minSize = 0;
        int currentIndex = 0;
        public static string tableName = "FA";

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;

            Thread trs = new Thread(new ThreadStart(dofor));
            trs.IsBackground = true;
            trs.Start();

            progressBar1.Minimum = minSize;

            string sql = "select count(id) from tablea ";
            maxSize = Convert.ToInt32(databind.GetSingle(sql));
            progressBar1.Maximum = maxSize;
        }

        public void dofor()
        {
            SetLableText("数据加载中...");
            currentIndex = minSize;
            string str = "";
            string sql = "select * from tablea";

            SqlDataReader dr = databind.GetExecuteReader(sql, false);
            DataTable Mydt = attribute.GetTableSchema();
            while (dr.Read())  //读取所有记录
            {
                CompareInfo Compare = CultureInfo.InvariantCulture.CompareInfo;  //设置indexof  不区分大小写
                #region 设置显示的标签进度
                SetLableText(string.Format("当前行:{0},剩余量:{1},完成比例:{2}%", currentIndex, maxSize - currentIndex,

                 (Convert.ToDecimal(currentIndex - minSize) / Convert.ToDecimal(maxSize - minSize) * 100).ToString("f0")));

                SetPbValue(currentIndex);
                #endregion

               ...

                    this.BeginInvoke(new MethodInvoker(delegate()
                    {

                        button1.Enabled = false;
                        textBox1.Text = str;
                    }));

                }
                currentIndex++;
            }

            attribute.BulkToDB(Mydt);

            this.BeginInvoke(new MethodInvoker(delegate()
            {

                button1.Enabled = true;
                textBox1.Text = "完成";
            }));

        }
        delegate void labDelegate(string str);

        private void SetLableText(string str)
        {

            if (label1.InvokeRequired)
            {
                Invoke(new labDelegate(SetLableText), new string[] { str });
            }

            else
            {
                label1.Text = str;
            }
        }
        delegate void pbDelegate(int value);

        private void SetPbValue(int value)
        {

            if (progressBar1.InvokeRequired)
            {

                Invoke(new pbDelegate(SetPbValue), new object[] { value });

            }

            else
            {

                progressBar1.Value = value;

            }

        }
    }
}
时间: 2024-10-10 20:09:42

winform开线程,避免页面假死的相关文章

谈.Net委托与线程——解决窗体假死

引言 在之前的<创建无阻塞的异步调用>中,已经介绍过异步调用的编写步骤和实施原理.异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能.可伸缩应用程序的关键.在多核CPU越来越普及的今天,异步编程允许使用非常少的线程执行很多操作.我们通常使用异步完成许多计算型.IO型的复杂.耗时操作,去取得我们的应用程序运行所需要的一部分数据.在取得这些数据后,我们需要将它们绑定在UI中呈现.当数据量偏大时,我们会发现窗体变成了空白面板.此时如果用鼠标点击,窗体标题将会出现"失去响应&

winform 利用 多线程 处理窗体假死,利用 Invoke BeginInvoke 处理子线程调用 UI 控件报错的问题

因为工作需要自己写了一个简单的工具软件,数据库查询每日OA未发送成功流程的日志记录以及批量重处理操作. 开始使用的是单线程,后台查询数据库的时候窗体假死,使用多线程很简单就能解决. private void btnQuey_Click(object sender, EventArgs e) { this.button2.Enabled = false; Thread connectionThread = new Thread(new ThreadStart(connectDB)); connec

ios 8 UITableView 编辑删除状态不点击“删除”,页面假死临时解决方案

ios8 UITableView 中编辑删除状态(isEditing:YES)不点击"删除"按钮点击其他位置,UITableView会假死,不可滑动,点击无效而userInteractionEnabled:YES,isEditing:NO(图片三--->图片四): 而低版本(如ios5)中编辑删除状态不点击"删除" UITableView会回到编辑状态(图片三--->图片二). 解决办法:当ios8 编辑删除状态不点击"删除"按钮点击

问题解决方案小技巧1:假如你的Java界面打不开或者长时间假死

原文地址:https://www.cnblogs.com/wanson/p/9153698.html

页面出现假死的问题

下面谈论的是Chrome浏览器. 很早以前,我就遇到过页面假死的现象.具体表现是:在标签页上一直转圈,页面不能打开.使用当前浏览器重新访问同一域名,会出现同样的现象. 最近我在工作中再次遇到这个问题. 出现的原因是一个页面同时发起了大量ajax请求.(例如都是向xxx.com域名发出请求).每一个请求都会花较长时间. 此时新开页面访问xxx.com就会出现卡死现象,并且在页面左下角会出现“正在等待可用的套接字”. 这时候进入chrome 内部调试工具 chrome://net-internals

C# winform窗体假死

C#  winform窗体假死 我们经常会遇到当执行一个比较大的函数时,窗体会出现假死的现象,给用户的体验不是很好,于是我们遇到了问题,那么就必须解决,我们该如何解决呢,首先在自己的脑里画个问号,接下来我们就一起研究吧! 先分析,这个问题是如何出现的呢!为什么会出现,如何避免出现,避免不了的,如何解决等,下面我们就去解决问题吧,遇到问题不要怕,解决问题是我们成长最快的时候,曾经别人告诉我,不怕不会做,就怕想不到.那我们就进入正题吧! 窗体假死是如何出现的呢? 在调用    testc();函数时

使用publisher模式控制频繁的UI输出,避免Winform界面假死

http://www.cnblogs.com/Charltsing/p/publisher.html 最近测试task并发任务的效率与线程池的区别,发现了另外一个问题.task建立任务的速度很快,输出到UI的信息过频,导致UI假死. private void TestMakeTasks(object obj) { string msg = ""; //循环创建task for (int i = 0; i < 3000; i++) { //主线程(winform)--子线程(Thr

C# 委托 线程 窗体假死

转载:http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html 异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能.可伸缩应用程序的关键.在多核CPU越来越普及的今天,异步编程允许使用非常少的线程执行很多操作.我们通常使用异步完成许多计算型.IO型的复杂.耗时操作,去取得我们的应用程序运行所需要的一部分数据.在取得这些数据后,我们需要将它们绑定在UI中呈现.当数据量偏大时,我们会发现窗体变成了空白面板.此时如果用

Winform刷新时界面假死、闪烁

1.界面假死 开启新的线程做一些计算操作,只有更新控件时才委托给Form线程更新界面. 2.Winform刷新时闪烁一般的this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);设置双缓冲.延时刷新 OCC时,机器人动作频繁刷新画面时,把form.Paint