【已解决】C#程序异常:Additional information: Exception has been thrown by the target of an invocation

【问题】

C#中,运行程序,异常:

Additional information: Exception has been thrown by the target of an invocation.

 

run doevents error Additional information Exception has been thrown by the target of an invocation

【解决过程】

1.后来,自己去看代码,好像看出问题了。

因为本身此处用的是BackgroundWorker,在completed函数中,用到了e.Result:

    private void bgwDownload_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // The background process is complete. We need to inspect
        // our response to see if an error occurred, a cancel was
        // requested or if we completed successfully.

        // Check to see if an error occurred in the
        // background process.
        if (e.Error != null)
        {
            //MessageBox.Show(e.Error.Message);
            return;
        }

        // Check to see if the background process was cancelled.
        if (e.Cancelled)
        {
            //MessageBox.Show("Cancelled ...");
        }
        else
        {
            bNotCompleted_download = false;

            // Everything completed normally.
            // process the response using e.Result
            //MessageBox.Show("Completed...");
            gRealReadoutLen = (int)e.Result;
        }
    }

但是,由于刚才不小心,在DoWork中,没有赋值e.Result:

    private void bgwDownload_DoWork(object sender, DoWorkEventArgs e)
    {
    //    // The sender is the BackgroundWorker object we need it to
    //    // report progress and check for cancellation.
    //    BackgroundWorker gBgwDownload = sender as BackgroundWorker;
。。。
        try
        {
。。。
            do
            {
。。。
                curReadoutLen = binStream.Read(respBytesBuf, curBufPos, (int)expectReadoutLen);
                if (curReadoutLen > 0)
                {
。。。
                    int currentPercent = (int)((currentLength * 100) / totalLength);
                    
                    if (currentPercent < 0)
                    {
                        currentPercent = 0;
                    }

                    if (currentPercent > 100)
                    {
                        currentPercent = 100;
                    }

                    gBgwDownload.ReportProgress(currentPercent);
                }
            } while (curReadoutLen > 0);
        }
        catch (Exception ex)
        {
            realReadoutLen = -1;
        }

        //return realReadoutLen;
        //e.Result = realReadoutLen;

        gBgwDownload.ReportProgress(100);
    }

所以,此处,当调用BackgroundWorker的complete时候,即在bgwDownload_RunWorkerCompleted中,会执行到

gRealReadoutLen = (int)e.Result;

而此处e.Result,没有赋值,所以估计是null值,所以去执行:

realReadoutLen = gRealReadoutLen;

才出错的。

所以,去把e.Result加上:

    private void bgwDownload_DoWork(object sender, DoWorkEventArgs e)
    {
    。。。
        //return realReadoutLen;

        gBgwDownload.ReportProgress(100);

        e.Result = realReadoutLen;
    }

【总结】

是自己不小心,在BackgroundWorker的DoWork中,把e.Result赋值漏掉了,所导致此问题。

加上后,就解决了。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量