http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 20659|回复: 8

[其他] C#多线程主界面卡死的问题

[复制链接]
发表于 2014-1-25 11:48:11 | 显示全部楼层 |阅读模式
[C#] 纯文本查看 复制代码
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.IO;
using System.Drawing.Printing;
using System.Collections;
using System.Threading;

namespace excel操作程序
{
    public partial class zhuti : Form
    {//委托
        public delegate void chuli();
//委托的对象
        chuli chu;
//子线程的对象
        Thread Thchuli;

        public zhuti()
        {
            InitializeComponent();
        }
//子线程运行的方法
        void ThreadStart()
        {
            this.BeginInvoke(chu);
        }

        private void zhuti_Load(object sender, EventArgs e)
        {
            chu = new chuli(run);
        }

private void btnEnter_Click(object sender, EventArgs e)
        {
            Thchuli = new Thread(ThreadStart);
            Thchuli.Name = "Excel处理";
            Thchuli.Start();
        }

void run()
{
//大量时间处理的函数
RichTextBox.Text="各种输出";
}

        private void zhuti_FormClosing(object sender, FormClosingEventArgs e)
        {
            Thchuli.Abort();
            Application.Exit();
        }
    }
}

这样应该没有什么问题才对,但是事实上是除了RichTextBox这个没卡死之外,其他的界面全部卡死了。求指定解决方案!

本帖被以下淘专辑推荐:



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-1-25 12:59:04 | 显示全部楼层
http://www.sufeinet.com/thread-3556-1-1.html
你确定看过我的文章了吗?
是在线程里调用委托来更新界面,这样不会卡,
而不是在委托里调用线程。
你写反了吧。
我建议你看懂的文章,而且这里面有源码下载的,你可以看看
把这个修改下
[C#] 纯文本查看 复制代码
  void ThreadStart()
        {
            //大量时间处理的函数
            this.BeginInvoke(chu);
        }

把   //大量时间处理的函数
把这些内容放到上面方法里面,而
[C#] 纯文本查看 复制代码
void run()
{

RichTextBox.Text="各种输出";
}
只用来更新界面,这样才不会卡,你在这里处理肯定会卡啊,这样相当于你没有用线程。
还在是主界面下运行的能不咔吗
 楼主| 发表于 2014-2-8 15:29:28 | 显示全部楼层
站长苏飞 发表于 2014-1-25 12:59
http://www.sufeinet.com/thread-3556-1-1.html
你确定看过我的文章了吗?
是在线程里调用委托来更新界面 ...

是这样的,苏老大,那个大量时间处理的函数里面调用了7个函数,那7个函数里面也分别写了对主界面的那个控件的显示。
这是不是意味着,我需要在每个函数里面都写上一个this.BeginInvoke(chu);?
发表于 2014-2-8 15:32:09 | 显示全部楼层
写个方法去调用就行了, 不用每个都写
 楼主| 发表于 2014-2-8 16:27:23 | 显示全部楼层
站长苏飞 发表于 2014-2-8 15:32
写个方法去调用就行了, 不用每个都写

我把代码给改过了
[C#] 纯文本查看 复制代码
        void ThreadStart()
        {
            object[] obj=new object[2];
            obj[0]="";
            obj[1]=30;
            run3(run2());
            this.BeginInvoke(chu, obj);
            run7(run6());
            this.BeginInvoke(chu, obj);
            run9(run8());
            this.BeginInvoke(chu, obj);
            run4();
            obj[1] = 10;
            this.BeginInvoke(chu, obj);
            //this.BeginInvoke(chu);
            obj[0] = "完成\r\n";
            obj[1] = 10;
            this.BeginInvoke(chu, obj);
        }

[C#] 纯文本查看 复制代码
        void run(string neirong,int Pb)
        {
            if (Pb != 0)
            {
                objPb.Step = Pb;
                objPb.PerformStep();
            }
            if (neirong != "")
            {
                Tdisplay.Text += neirong + "\r\n";
            }
            Tdisplay.Select(Tdisplay.Text.Length, 0);
            Tdisplay.ScrollToCaret();
        }

其中Tdisplay是RichTextBox
objPb是进度条控件现在界面果然不卡了,但是出现了一个现象 QQ截图20140208162539.jpg

出现了两个“完成”,但是我很确定,我整个代码里面就只有以上那一个地方有“完成”,他怎么就出现了两个呢???
发表于 2014-2-8 16:28:59 | 显示全部楼层
应该是调用了两次,你再检查一下,这说明问题解决了。现在的问题就是逻辑问题。
 楼主| 发表于 2014-2-12 15:57:55 | 显示全部楼层
站长苏飞 发表于 2014-2-8 16:28
应该是调用了两次,你再检查一下,这说明问题解决了。现在的问题就是逻辑问题。

[C#] 纯文本查看 复制代码
void ThreadStart()
        {
            object[] obj=new object[2];
            obj[0]="";
            obj[1]=30;
            run3(run2());
            this.BeginInvoke(chu, obj);
            run7(run6());
            this.BeginInvoke(chu, obj);
            run9(run8());
            this.BeginInvoke(chu, obj);
            run4();
            obj[1] = 10;
            //this.BeginInvoke(chu, obj);
            //this.BeginInvoke(chu);
            obj[0] = "完成\r\n";
            obj[1] = 20;
            this.BeginInvoke(chu, obj);
        }

我把代码改成这样了,然后就只会出现一个完成了。为什么会这样?注释的那个明明是前面的,为什么还会显示完成呢?
发表于 2014-6-13 13:22:18 | 显示全部楼层
所谓的安全线程是怎么样的
发表于 2019-5-31 17:40:34 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-23 06:56

© 2014-2021

快速回复 返回顶部 返回列表