关于在异步调用中的按引用传递问题

        由于打印是跟主线程处在同一个线程,所以在进行打印操作时波形绘制会停顿几秒,这样会影响显示效果,所以将打印操作改为异步调用,用另外一个线程来执行。原来的程序为:
(代码段1)
private void OnPrintEcgRaplayWave(CMsg msg)
        {
            Debug.Assert(msg.Msg == (uint)MTMultiParamPrintPlugIn.PrintEcgRaplayWave);
            Debug.Assert(msg.WParam is CDomPatient);
            Debug.Assert(msg.LParam is ArrayList);

            CDomPatient cdp = (CDomPatient)msg.WParam;
            ArrayList alWaveData = (ArrayList)msg.LParam;
            CDocPrintWave cdpw = new CDocPrintWave();
            cdpw.SetPrintDocument(cdp, alWaveData);
            cdpw.BeginPrint();
     ... ...
上述代码在接收请求打印消息PrintEcgRaplayWave后开始执行的,由于最后三行代码是直接执行的,所以改为如下代码,创建一个任务包启动另外一个线
程,以便执行打印:
(代码段2)
IInvokePackage ip = (IInvokePackage)this.SendSysMsg(new CMsg(MTSystemService.CreateInvokePackage, true));
            if (null == ip){
                return;
            }

            ip.TargetObject = this;
            ip.TargetMethod = new InvokeHandler_Print(PrintWave);
            ip.Parameters.Add(cdp);
            ip.Parameters.Add(alWaveData );
            ip.Callback = new AsyncCallback(OnPrint_Callback);

            this.SendSysMsg(new CMsg(MTSystemService.BeginInvoke, ip)); 
     ......
其中ip为任务包,PrintWave函数为启动异步操作时所执行的打印功能,ip.Parameters.Add()方法将参数打包以便传递到新线程中使用。
函数PrintWave的实现为:
(代码段3)
private void PrintWave(CDomPatient cdp, ArrayList alWaveData)
        {
            if (null == cdp || alWaveData.Count <= 0){
                return;
            }
    CDocPrintWave cdpw = new CDocPrintWave();
           cdpw.SetPrintDocument(cdp, alWaveData);               
           cdpw.BeginPrint();
 }
本来这样的实现是可以的,即将原来直接在当前线程的操作用另一个线程来执行,以便当前线程继续其他的操作。但最终运行程序时打印却未成功,一跟
踪程序原来在代码段3中传递过来的ArrayList类型参数alWaveData里面的集合为空。怎么会这样呢,在代码段2中代码ip.Parameters.Add(alWaveData );传递参数时明明有成员,但接收时集合却为空。最后查看发打印请求消息PrintEcgRaplayWave的代码才发现原因所在,其代码为:
(代码段4)
this.SendSysMsg(new CMsg(MTMultiParamPrintPlugIn.PrintEcgRaplayWave, this.PatientHistory.Patient, this.m_alWaveData));
this.ClearPrintData();

public void ClearPrintData()
        {
            this.m_alWaveData.Clear();
     ... ...
原来此处在发送完请求打印消息后,就调用了函数ClearPrintData,而此函数中进行了集合清空操作:this.m_alWaveData.Clear();由于接收此消息的代码段2中启动的线程为异步操作,也就是说并不能马上执行,而此时上述集合清空的操作已经执行了。并且传递的参数m_alWaveData为对象,即按引用传递的。所以在异步操作开始执行时,此集合对象已经被清空,也就无法进行正确的打印操作了。解决办法是将代码段中2的代码ip.Parameters.Add(alWaveData );改为:ip.Parameters.Add(alWaveData .Clone());即将此参数对象克隆,这样别处对该对象的清除操作并不影响异步操作中对该数据的使用。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值