混,,,,,,, returnValue = null;
  returnValue = param;
到底想干什么???

解决方案 »

  1.   


      returnValue = null;
      returnValue = param;
    ??????????????把你的问题描述和相关代码整理一下,上面连续两句这是怎么回事??????/
    getReturnValue() 这个谁调用?什么时候调用?
      

  2.   

    应用程序A调用这段代码中的read方法,然后这段代码中的监听器监听这个方法的执行结果,如果执行成功,setReturnValue((byte[]) vector.elementAt(0));然后A再调用这个类中的
    getReturnValue() 得到返回值,“returnValue = null;”作用仅仅是清楚一下缓存,不知我说得是否清楚,请各位指教
      

  3.   

    returnValue = null;应该是没有用的,
    garbage collect不是您想清就可以马上清的!
      

  4.   

    “returnValue = null;”作用仅仅是清楚一下缓存,这个理解是不正确地。直接用returnValue = param;的效果一样的。得到returnValue = null的原因是你的线程取值时,returnValue还是初始定义时null引用的成员变量(函数中,必须付初值),第2次取时returnValue已经赋值了,所以是他所引用的数组。
      

  5.   

    我也觉得你的思路有点乱
    你这样做和int x=0; x=1没有任何区别,
      

  6.   

    那现在我们不用管returnValue = null,就当程序中没有这句话,那原因出在哪儿,她第一次返回null,第二次才能返回正确的值
      

  7.   

    我觉得问题可能是这样子的,第一次调用完read方法的时候,operationCompleteOccurred方法并没有执行完毕后,就开始调用getReturnValue() 方法,这时自然返回空值。当第二次读取的时候,operationCompleteOccurred方法已经执行完毕,这时返回第一次调用得到的值,这时也就能返回值,而这次返回的值实际上是第一次调用后的到的值,所谓的正确也是错误的了,也就是说每次返回的只是上次调用得到的值,所以每次调用后得到得值都不正确。望各位大虾指正
    具体怎么解决我再想想
      

  8.   

    同志们,辛苦了
    TO 笑着:
    这个类实现了operationComplete的接口,它负责监听operationCompleteOccurred方法。我觉得水中鱼的说法可能有点道理,不知您认为呢?
      

  9.   

    因为你那两个方法都是被同步的,所以我认为“operationCompleteOccurred方法并没有执行完毕后,就开始调用getReturnValue() 方法”这种情况是不会出现的。
      

  10.   

    我调了一下,它的执行顺序是这样的client---read()-----operationCompleteOccurred()------setReturnValue()
      |------getReturnValue()
             (这时returnValue为空,因为上面operationCompleteOccurred()还没执行完毕)求解??
      

  11.   

    看了诸兄的回复,本人认为:
    只要能够在client读取read方法的同时,等到operationCompleteOccurred()执行完毕,然后再getReturnValue(),就能解决问题了,各位以为如何
      

  12.   

    client---read()-----operationCompleteOccurred()------setReturnValue()
      |------getReturnValue()如果确实是这样的执行图形的话,我想你需要把read也synchronized
      

  13.   

    好像还不对  不知道你crControl.Read();干什么了。他执行之后    operationCompleteOccurred()------是如何得到执行的?按你的图形应该是这之间getReturnValue()得到了调用。你自己看看吧。
      

  14.   

    如果我没理解错如果你read后是一条直线(就是没有另外的线程)调用operationCompleteOccurred()的执行,那read同不就应该没问题了如果另外线程负责operationCompleteOccurred()调用,恐怕麻烦比较大了。至少代码结构是要改的了
      

  15.   

    我把read也同步了,执行结果还是没变,现在一筹莫展
      

  16.   

    我看了你的代码,觉得和同步的关系并不大,正如笑着同学所说,成员函数都被定义成同步的情况下,不可能发生抢占资源的问题.我认为还是逻辑上的问题,但是没有上下文,我无法做进一步的判断.我不知道你是否尝试了下面两种情况(1)把
    public void setReturnValue(byte[] param) {
      returnValue = null;
      returnValue = param;
    }
    中的returnvalue=null去掉是不是也是一样的结果?(2)将
    setReturnValue((byte[]) vector.elementAt(0));
    改为setReturnValue(一个不是null的固定值)是不是也是一样的结果?(3)将
    public void setReturnValue(byte[] param) {
      returnValue = null;
      returnValue = param;
    }
    中的returnValue=param的param改成一个固定值是否也是一样的结果根据我的习惯,我会这样做,没有特别的依据,但目的是为了确定问题出在哪一块,我认为你目前还没能够找到问题的所在地,因此大家的讨论也就偏离了方向
      

  17.   

    你把setReturnValue()也同步试试