当前位置: 代码迷 >> C# >> C#多次调用DLL结果不一致解决思路
  详细解决方案

C#多次调用DLL结果不一致解决思路

热度:64   发布时间:2016-05-05 03:54:56.0
C#多次调用DLL结果不一致
用周立功的USBCAN库做二次开发,调用dll中的一个函数(Do_VCI_StartCAN(),见下)时,在我电脑上用几次会随机的出现一两次不成功,换一台电脑就没有这种情况。

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            VCI_Return_Status re = 0;
            try
            {
                re = this.vm_binding.vm_caninstance.Do_VCI_OpenDevice();
                if (re == VCI_Return_Status.STATUS_OK)
                {
                    this.lbl_status.Content = "打开设备成功";
                    
                    re = this.vm_binding.vm_caninstance.Do_VCI_StartCAN();//就是这里
                    if (re == VCI_Return_Status.STATUS_OK)
                    {
                        this.lbl_status.Content = "开始接收CAN数据...";
                        this.vm_binding.vm_timer.Start();
                        this.DataSaveTimer.Start();
                    }
                    else
                    {
                        this.lbl_status.Content = "开始接收数据失败。请检查设备连接是否正确,然后重新启动程序。";
                        this.vm_binding.vm_timer.Stop();
                        this.DataSaveTimer.Stop();
                    }
                }
                else
                {
                    this.lbl_status.Content = "打开设备失败,请检查设备是否正确连接PC,是否正确安装设备驱动";
                }

            }
            catch (Exception excp)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("打开设备异常:").Append(excp.Message);
                // this.lbl_status.Content = sb.ToString();
            }
        }


单步过的时候是OK的,想请问调用一个DLL时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查
非常感谢!
------解决思路----------------------
你可以在代码里面延时1秒重试。
------解决思路----------------------
弄个Log4net什么的写日志,把运行状况记下来,然后分析程序运行出问题时的环境上下文,如果多线程,共享资源加个锁,测一下还有没有问题,出问题时记录下线程号或端口资源使用状况,看是不是并发引起的。
------解决思路----------------------
引用:
用周立功的USBCAN库做二次开发,调用dll中的一个函数(Do_VCI_StartCAN(),见下)时,在我电脑上用几次会随机的出现一两次不成功,换一台电脑就没有这种情况。

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            VCI_Return_Status re = 0;
            try
            {
                re = this.vm_binding.vm_caninstance.Do_VCI_OpenDevice();
                if (re == VCI_Return_Status.STATUS_OK)
                {
                    this.lbl_status.Content = "打开设备成功";
                    
                    re = this.vm_binding.vm_caninstance.Do_VCI_StartCAN();//就是这里
                    if (re == VCI_Return_Status.STATUS_OK)
                    {
                        this.lbl_status.Content = "开始接收CAN数据...";
                        this.vm_binding.vm_timer.Start();
                        this.DataSaveTimer.Start();
                    }
                    else
                    {
                        this.lbl_status.Content = "开始接收数据失败。请检查设备连接是否正确,然后重新启动程序。";
                        this.vm_binding.vm_timer.Stop();
                        this.DataSaveTimer.Stop();
                    }
                }
                else
                {
                    this.lbl_status.Content = "打开设备失败,请检查设备是否正确连接PC,是否正确安装设备驱动";
                }

            }
            catch (Exception excp)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("打开设备异常:").Append(excp.Message);
                // this.lbl_status.Content = sb.ToString();
            }
        }


单步过的时候是OK的,想请问调用一个DLL时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查
非常感谢!

加log,记录下每次调用的相关参数,拿这些参数进行调试,看复现么?
------解决思路----------------------
遇到困难而临时磨枪,谁也没有什么简单的解决办法。

只能是“把随机变为必然”,你能找到以任何方法序列、到任何人的机器、使得10次中至少有7次能够重现问题,这时候才能开始解决问题。否则你要做的就是把“随机变成必然”的这种初级的工作,它很重要而且经常是浪费大量时间,但是不这样办就不能发现问题。

所以好的产品都把以前的几百个深度的问题写成了自动化测试用例,使得以后可以随时拿出来对产品进行质量控制之用。而如果一个产品是小作坊做的,那么就更容易遇到翻车、令人想放弃的bug。
  相关解决方案