检测到断开连接的上下文
本文关键字:上下文 连接 断开 检测 | 更新日期: 2023-09-27 18:03:52
我在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'未连接。从当前上下文(context 0x1a1008)中释放接口。这可能会导致损坏或数据丢失。为了避免这个问题,请确保所有上下文/公寓在应用程序完全完成之前都是有效的
在我的情况下,我使用Outlook,我得到了一个类似的错误,当试图访问Outlook对象模型上的线程而不是'主线程'。在我的outlook插件中,我也有一个Windows窗体,在Windows窗体上,我启动了一个新线程,该线程开始了一个需要访问outlook对象模型的长时间运行操作。此外,这个线程试图在某些里程碑更新Windows窗体上的进度条。根据下面的文章,我做了2个修改,似乎解决了这个问题:
http://msdn.microsoft.com/en-us/library/8sesy69e%28v=vs.100%29.aspx反馈我所做的改变:
将线程更改为单线程公寓
删除触发事件以更新主线程进度条的代码
如果我理解你的问题,问题是Excel打开时显示你的文件?这是预期的,你所有的代码都是在操纵Excel应用程序。Excel会显示你的文件,它不知道它是不是用户文件
如果你真的不想这样,那么不使用COM/Interop是前进的方向。看看OpenXML库和ClosedXML库,它们使前者和Excel的工作非常容易。
最后,如果你真的想每分钟都写……Excel也不是你想要的格式。查看纯文本、XML或某种嵌入式数据库
在Visual Studio的调试模式下运行Excel VSTO工作簿时,我得到了相同的消息。它修复了构建工作簿,退出IDE并直接运行它。
您可以通过禁用exception来删除异常:
- 选择项目。
- 返回菜单:Debug->Exceptions
- Goto Managed Debugging异常。并从异常类型中删除检查,您遇到了。