外向小朋友 2019-09-06 10:48 采纳率: 66.7%
浏览 321
已采纳

c#写的窗体未响应问题,不是控件没有用委托得原因,建议看一下我放在顶部的源码链接

首先把文件源码放出来
文件源码
如下是代码,这里面有两个线程,里面各有一个死循环,第一个线程是用来循环保持连接,第二循环是监听任务并执行任务,运行后的结果是,有时候点击会出现未响应,然后过个几秒恢复,我考虑过是Thread.sleep的原因,于是我用Delay()替代了sleep,但是好像没有什么作用,所以请各位帮忙看看

public static void Delay(int mm)
        {
            DateTime current = DateTime.Now;
            while (current.AddMilliseconds(mm) > DateTime.Now)
            {
                Application.DoEvents();
            }
            return;
        }
//创建一个任务,循环保持连接
            Thread stock = new Thread(KeepStockStatus);
            stock.Start();
//开始运行
Thread thread = new Thread(new ThreadStart(() =>
            {
                while (IsRunning)
                {
                    Delay(1000);
                    //Thread.Sleep(TimeSpan.FromSeconds(1));      //等待1秒钟
                    int x=monitorStatus();
                    if (x == STATUS_WORK)
                    {
                        //Thread.Sleep(120);
                        //KeepStockStatus();
                        Delay(200);
                        //Thread.Sleep(200);
                        InRequest();
                        Delay(100);
                        //Thread.Sleep(100);
                        OutRequest();
                    }
                }
            }));
            thread.IsBackground = true;
            thread.Start();
  • 写回答

4条回答 默认 最新

  • hxycsdn9159 2019-09-09 10:48
    关注

    首先在线程里面调用Thread.Sleep()方法是没有任何问题的,并不会造成UI线程的未响应,所以你这个Delay()方法大可以去掉,其次看了你的源代码,感觉问题应该不是出现在上位机这一层,axActUtlType1应该是别人给你的ocx或者activex控件吧?建议你写个测试程序直接调用这个控件的接口,很简单的调用,就是打开,发送请求等等,看看是不是界面也会未响应,因为不管ocx还是activex这种UI控件本身就需要寄宿在上位机的Form上,如果写这个ocx的人没有把很耗时的操作放到新的线程里面去执行那必然会卡你上位机的界面,比如发送或者读取数据和串口等交互的时候是很耗时的,个人感觉问题应该是出在了这个控件上。如果是出现在了这个控件上,那你上位机在怎么折腾也是瞎忙活,解决办法有两个:1.找给你控件的人改代码,让他把耗时的操作自己创建线程去执行,然后给你回掉函数。2.如果实在没办法改这个控件,那就只能你自己写两个程序,一个去调用这个控件,一个来画界面,用进程间通信的方法或者是socket协议都可以。最后,从你调用这个控件的方式来看,都是直接axActUtlType1.方法(),这种同步的调用方式八成是写控件的人直接就在UI线程处理那些接口的逻辑了,根本没考虑卡界面的问题,一般如果考虑的话肯定会给你异步的调用方法,然后通过回调函数把结果给你。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已采纳回答 10月25日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵