这个应该是PriShortChamberRecipeArray这个数组变量的生存周期的问题吧,这是定义在方法中的局部变量,你是起线程执行的,等到线程函数开始处理时,该数组已经被释放掉了,虽然没有被销毁,但是内容已经是无法确定的了,可能已经被重新分配了,所以你看到的是一些随机数。

解决方案 »

  1.   


    应该不是,我前后都写log了啊?前后写log的数据没有问题啊?
      

  2.   

    iRet = _AxActQJ71E71TCP.WriteDeviceBlock2("R0", _PriShortChamberRecipeArray.Length, ref _PriShortChamberRecipeArray[0]);
    这行换成下面的代码试试是否正常
    iRet = (int)Application.OpenForms[0].Invoke((Func<int>)(() => _AxActQJ71E71TCP.WriteDeviceBlock2("R0", _PriShortChamberRecipeArray.Length, ref _PriShortChamberRecipeArray[0])));
      

  3.   

    或者把刚才那行还原,修改这个地方试试
    t = new Thread(new ThreadStart(tws.ThreadProc));
    t.ApartmentState = ApartmentState.STA;
    t.Start();
    t.Join();
      

  4.   

    兄弟,这个方法 不行。上一个方法可以,但是有个问题。
    如果是winform的话,System.Func有这个,但是WPF的Sytem空间没有这个,请教怎么解决?
      

  5.   

    具体原因我也不好说,没有的话你声明个
    delegate T Func<out T>();
      

  6.   


    最后一个问题大侠,Application.OpenForms.Count为什么是0?我在类库里面调用的?
      

  7.   

    Application.OpenForms[0].Invoke //这个是winform的,可以用Invoke。
    Application.Current.Windows[0]  //WPF的好像没有Invoke,怎么办?
      

  8.   

    那就这样
    iRet = (int)Application.Current.Windows[0].Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, (Func<int>)(() => _AxActQJ71E71TCP.WriteDeviceBlock2("R0", _PriShortChamberRecipeArray.Length, ref _PriShortChamberRecipeArray[0])));
      

  9.   

    大侠你好人做到底吧,我发现我的类库里面无法使用Application.Current,只能使用Application.OpenForms,我怎么用我的WPF GUI传递进去?
      

  10.   

    把项目引用列表里 System.Windows.Forms.dll 这个引用去掉,引用 PresentationFramework.dll,cs 文件里 using System.Windows.Forms; 去掉,加上 using System.Windows;
      

  11.   

    楼上几位扯远了,居然扯到了多线程开启的方法上面去了,这和问题毫不相干。我想知道你的“t.Join();”肯定存在吗?这个代码意味着多线程和单线程完全相同的效果了,必须等待执行完成后才能返回的。你确定没有同时2个线程一起往设备写?
      

  12.   

    另外建议yunhaiC 每天上一次论坛,随便回帖一次,每天回帖可得10分可用分,你只有遇到问题才来一发,搞的都没分发帖了,真正有需要的时候发不了高分帖,这将影响到得到解答的效率