检测到断开的上下文

时间:2011-07-28 08:00:39

标签: c#

我的c#应用程序“检测到已断开连接的上下文”中收到错误消息。 错误的原因是什么?如何解决这个问题呢? 我在这里解释我的代码流程。

我已经启动了一个数据收集线程。它从com端口收集数据并将数据保存在EXCEl文件中。

DATA COLLECTION(THREAD)---> SCAN 232 PORT(THREAD)------>打印到EXCEL。

我从MSDN库中发现了此错误的一些原因。它说MDA援助。但我不是c#中经验丰富的开发人员。所以我无法理解这个问题。请帮我解决这个问题。

这不是您的参考的完整代码我复制了一些我用来创建和编写excel文件的部分。

我还面临一个问题。

在excel上写入数据时,如果我打开任何其他excel文件,我将在代码中使用的当前数据库文件也将打开。怎么解决这个?

app = new Excel.ApplicationClass();

  Workbook1 = app.Workbooks.Add(Type.Missing);

  Worksheet1 = (Excel.Worksheet)Workbook1.Worksheets[1];//ACtivating sheet-1 of workbook.


public bool Load_Excel_file(string Filename)
    {
        Excel_Filepath = Filename;

        try
        {
            if (Excel_Filepath  != "")
            {                

                Workbook1.SaveAs(Excel_Filepath, Excel.XlFileFormat.xlXMLSpreadsheet,
               Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);


            }

            else
            {

                lbl_database.Text = "Database OFF";

            }

            if (ExcelFile_Select.Checked == true)
            {
                rbtn_database.Checked = true;          
                lbl_database.Text = "Collecting data on Database";
            }

            return (true);
        }
        catch
        {
            ExcelFile_Select.Checked = false;
            lbl_database.Text = "Database OFF";

            end_excel();       
            return (false);

        }

    }

 public void Print_to_Excel(object  exc_row_cnt_t, object  exc_col_cnt_t, object grid_row_cnt_t)
{
    Worksheet1 = (Excel.Worksheet)Workbook1.Worksheets.Add(Type.Missing, (Excel.Worksheet)Workbook1.Worksheets[Sheet_Num++], Type.Missing, Type.Missing); 
try{

            for (int column_count = 1; ((column_count) < Grid_Collect_Data.ColumnCount - UNUSED_CELLS); column_count++)
            {
                if ((Grid_Collect_Data.Rows[grid_row_cnt].Cells[column_count].Value) != null)
                {
                    ((Excel.Range)Worksheet1.Cells[exc_row_cnt, (exc_col_cnt * (Grid_Collect_Data.ColumnCount - UNUSED_CELLS )) + column_count ]).Value2 = (Grid_Collect_Data.Rows[grid_row_cnt].Cells[column_count].Value).ToString();
                    ((Excel.Range)Worksheet1.Cells[exc_row_cnt, (exc_col_cnt * (Grid_Collect_Data.ColumnCount - UNUSED_CELLS)) + column_count]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;
                }
            }


  Workbook1.Save();
 }
  catch (Exception e)
        {
            end_excel();           

            MessageBox.Show(e.ToString(), "Wireless Sensor Network", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

        }

 }
 void end_excel()
    {


        Workbook1 = null;
        Worksheet1 = null;
        app.Quit();
        app = null;
        if (Worksheet1 != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(Worksheet1);
        if (Workbook1 != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(Workbook1);
        if (app != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
        Workbook1 = null;
        Worksheet1 = null;
        app = null;

        GC.Collect();
        Excel_app_run = false;
        Is_Load_Report = false;


    }

错误讯息:

上下文0x1a1178'已断开连接。从当前上下文释放接口(上下文0x1a1008)。这可能导致损坏或数据丢失。 为避免此问题,请确保所有上下文/公寓保持活动状态,直到应用程序完全完成 RuntimeCallableWrappers,表示存在于其中的COM组件。

4 个答案:

答案 0 :(得分:1)

在我的情况下,我使用Outlook,当我尝试在“主线程”以外的线程上访问Outlook对象模型时,我遇到了类似的错误。在我的Outlook加载项中,我也有一个Windows窗体,在Windows窗体上,我开始了一个新的线程,开始了一个需要访问Outlook对象模型的长时间运行操作。此外,该主题试图在某些里程碑上更新Windows窗体上的进度条。我根据下面的文章进行了2次修改,似乎解决了这个问题:

http://msdn.microsoft.com/en-us/library/8sesy69e%28v=vs.100%29.aspx#feedback

我所做的改变:

  • 将线程更改为单线程公寓

  • 删除触发事件的代码以更新主线程上的进度条

答案 1 :(得分:0)

如果我了解您的问题,问题是打开时Excel会显示您的文件吗?期望您对代码的所有操作都在操纵Excel应用程序。因此,Excel会显示您的文件,但它并不知道&#39;它不是用户文件。

如果你真的不想要这个,那么不使用COM / Interop就是前进的方向。 查看OpenXML库和ClosedXML库,它使得使用前者和Excel非常容易。

最后,如果您真的想要每分钟写一次...... Excel也不是您想要写的格式。查看纯文本,XML或某种嵌入式数据库。

答案 2 :(得分:0)

在Visual Studio的调试模式下运行Excel VSTO工作簿时,我得到了相同的消息。它对其进行了修复,以构建工作簿,退出IDE并直接运行它。

答案 3 :(得分:-4)

您可以通过以下方式禁用例外来删除例外:

  1. 选择项目。
  2. 转到菜单:调试 - &gt;例外
  3. 转到托管调试异常。并从您遇到的异常类型中删除检查。