断开的上下文被检测到。

6
我在我的C#应用程序中收到了一个错误信息:“检测到已断开的上下文”。这个错误的原因是什么?如何解决这个问题?以下是我代码的流程。
我启动了一个线程来进行数据采集。它从com端口收集数据并将数据保存在Excel文件中。
数据采集(线程)--->扫描232端口(线程)------>打印到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)中释放接口。这可能会导致损坏或数据丢失。为避免此问题,请确保所有上下文/公寓都保持活动状态,直到应用程序完全完成代表其中运行的 COM 组件的 RuntimeCallableWrappers。


1
好的,我们需要更多的细节。你使用的是什么技术(例如OLEDB),你能提供一些你正在尝试做的源代码吗?干杯。 - Jason Evans
app = new Excel.ApplicationClass();Workbook1 = app.Workbooks.Add(Type.Missing);Worksheet1 = (Excel.Worksheet)Workbook1.Worksheets[1];//激活工作簿的第1个表单。 - Paramasivan
我已经将您的评论添加到问题中,但这只是一个片段。您如何/在哪里将其推送到主线程?精确的错误消息和堆栈转储可能会有所帮助。以及异常起源周围的代码。 - H H
谢谢回复。现在我添加了确切的错误信息,请看一下。但很抱歉由于大小问题我无法发布代码,只能解释一下我如何保存在Excel中。这个应用程序是为一个无线模块设计的。在窗体加载时,我创建一个Excel文件(使用另存为命令并指定文件名),并启动一个主线程来开始数据采集。在这个线程内部,我又启动了一个扫描232端口的线程。它收集数据并将其写入工作簿。扫描232端口使用1分钟的定时器间隔。它始终扫描端口并将数据写入Excel并保存。 - Paramasivan
你可以随时发布几行相关的代码,这样就没有大小限制了。现在这个问题无法回答。 - H H
显示剩余2条评论
4个回答

1
在我的情况下,我正在使用Outlook,当尝试在“主线程”以外的线程上访问Outlook对象模型时,出现了类似的错误。在我的Outlook插件中,我还有一个Windows窗体,在该窗体上,我启动了一个新线程,开始一个需要访问Outlook对象模型的长时间运行操作。此外,该线程正在尝试在Windows窗体上的某些里程碑更新进度条。根据下面的文章,我进行了两个更改,似乎修复了这个问题:

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

我所做的更改:

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

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


0

如果我理解您的问题,问题是Excel打开时显示您的文件?这是预期的,因为您的代码所做的一切就是操作Excel应用程序。因此,Excel将显示您的文件,它不知道它不是用户的文件。

如果您真的不想要这个功能,那么不使用COM / Interop是前进的方法。研究OpenXML库和ClosedXML库,这使得使用前者和Excel非常容易。

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


0

当我在Visual Studio的调试模式下运行Excel VSTO工作簿时,我收到了相同的消息。解决方法是构建工作簿,退出IDE并直接运行它。


-5

你可以通过禁用异常来解决这个问题:

  1. 选择项目。
  2. 转到菜单:调试->异常
  3. 转到托管调试异常。然后取消选中你遇到的异常类型。

10
这不是一个好的解决方案。关闭警告就像拆掉汽车里的“低油量”指示灯而不是加油一样,它仅隐藏了问题的存在。MDA监视器可以找到使用调试器和逐行检查代码无法发现的错误。该错误提示开发人员存在线程上下文切换问题。 - Jordan Parmer
3
如果我的账户允许,我会给这个答案投反对票。 - public wireless
@publicwireless,现在你可以回来给它一个强有力的反对票。 - CyberFox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接