c#多线程调用ui,关闭线程的时候ui卡死

qq_21238201 2017-04-27 12:55:42
先上代码吧




先[/code]看下代码。这个是我把其他的都删了。反正意思就是一个ui打开多线程。多线程方法在类里,其实就是无限循环一件内容,然后会向ui的listbox输出内容。我的程序运行什么都没有问题这个不用考虑。就是结束线程的时候经常会ui卡死。其实就是卡在锁那个地方。我试过了用委托也一样会卡死ui。现在有什么办法?听人说用事件线程控制事件 在结束的时候不会卡ui。具体怎么写谁能帮我看看,也可以有偿联系我,如果会的帮我看看吧!!急,说的不清楚尽量把代码写出来。
...全文
678 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jwh2004 2017-04-29
  • 打赏
  • 举报
回复
同意sp1234 使用变量通知线程正常结束就行,把强行关闭线程的代码去掉吧,我的程序很多年都这样用,没问题。 至于直接把整个应用程序杀掉,会造成内存泄漏,而且大的软件系统还会造成逻辑上不可预知的后果,一个好的程序员是坚决不这样干的。
彭123 2017-04-28
  • 打赏
  • 举报
回复
引用 10 楼 qq_21238201 的回复:
我的意思就是,一个按钮开始线程打开3个线程,一个按钮关闭线程。3个线程对UI输出。点击关闭按钮的时候UI卡死
我是直接把整个应用程序杀掉,关啥线程。
qq_21238201 2017-04-27
  • 打赏
  • 举报
回复
我的意思就是,一个按钮开始线程打开3个线程,一个按钮关闭线程。3个线程对UI输出。点击关闭按钮的时候UI卡死
xdashewan 2017-04-27
  • 打赏
  • 举报
回复
引用 7 楼 qq_21238201 的回复:
哎,你不要管那个,我把代码都删了,我的意思是一个按钮开始线程,一个按钮关闭线程。线程对UI输出。点击关闭按钮的时候UI卡死
问题是你没关线程,还搞不懂吗,没人关系你删了哪些代码,我只看到,你开了下标为1的线程,结果去关下标为0的线程,这能关的掉吗
  • 打赏
  • 举报
回复
永远不要使用 Abort,让你的线程执行的过程“正常”结束。这里的正常是很重要的。否则你怎么知道线程执行的过程崩溃在哪里、会把进程中的数据、组件都搞乱掉。 当然实际上也不需要写 Join。就是写类似
        public void 结束button_Click(object sender, EventArgs e)
        {
            i = i - 1;
            MainThreadList [i].flag = false;
这样的代码。 把 while(true) 改为
wile(falg)
{
......
}
让过程正常结束。再说一遍,是正常结束,而不是让线程崩溃。
qq_21238201 2017-04-27
  • 打赏
  • 举报
回复
哎,你不要管那个,我把代码都删了,我的意思是一个按钮开始线程,一个按钮关闭线程。线程对UI输出。点击关闭按钮的时候UI卡死
xdashewan 2017-04-27
  • 打赏
  • 举报
回复
引用 5 楼 qq_21238201 的回复:
我说了,和框架没问题,我是把代码删除了,反正就是多线程和UI
你多线程启动和结束压根就不对,这和框架是没关系,和你逻辑有关系,这么明显的bug放在那里,你仍然要无视,那就没法继续谈了
qq_21238201 2017-04-27
  • 打赏
  • 举报
回复
我说了,和框架没问题,我是把代码删除了,反正就是多线程和UI
xdashewan 2017-04-27
  • 打赏
  • 举报
回复
你这代码有bug,第一次启动就跳过0号线程,但你关的却是0号,1号压根就没关
danyu5527 2017-04-27
  • 打赏
  • 举报
回复
如果上面图片看不到代码复制过来了

   public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            this.StartPosition = FormStartPosition.CenterScreen;
            CheckForIllegalCrossThreadCalls = false;//加了这个是为了多线程可以控制UI窗体
        }

        //----------------------------------------------------------------全局变量声明区
        Thread[] 主线程 = new Thread[7];//线程的声明
        public object dclock = new object();
        int i=0;
        //----------------------------------------------------------------全局变量声明区    
        private void 开始挂机butten_Click(object sender, EventArgs e)
        {
            i = i + 1;
            MainTherad a = new MainTherad();
            主线程[i] = new Thread(a.MainThread);
            主线程[i].IsBackground = true;
            主线程[i].Start();//打开线程
            Thread.Sleep(500);// 加个延迟.避免多窗口同步启动吧.
        }
        public void 结束button_Click(object sender, EventArgs e)
        {
            i = i - 1;
            try
            {
                主线程[i].Abort();
                主线程[i].Join();
            }
            catch
            {}
        }
        public void 输出(string 输出内容)
        {
                lock (dclock)//枷锁下线程调用的时候不会共同使用这个然后出错
                {
                    listBox调试滚动窗口.Items.Add(输出内容);
                    listBox调试滚动窗口.SetSelected(listBox调试滚动窗口.Items.Count - 1, true);
                }
        }

下面是MainTherad类的内容
    public class MainTherad
    {
        //----------------------------------------------------------------全局变量声明区
        public int 线程ID;
        //----------------------------------------------------------------全局变量声明区     

        public void MainThread()                                   //脚本主线程
        {
            try
            {
                while (true)
                {
                    Program.MainForm.输出(" ----- ");

                }
            }
            catch
            { }
        }

    }


danyu5527 2017-04-27
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
代码看不到,估计是你主线程退出了子线程还未退出,可以把IsBackground设成true试试
是true啊设置了
xdashewan 2017-04-27
  • 打赏
  • 举报
回复
代码看不到,估计是你主线程退出了子线程还未退出,可以把IsBackground设成true试试

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧