求助,关于用C#开发excel插件的多线程问题

weixin_42405356 2019-03-28 10:22:50
最近在用C#开发一个excel插件,就是获取表格链接,然后从对应地址下载文件保存到本地后在后方单元格备注已下载。为了保证下载时能正常浏览excel将下载操作放到了另一个线程里,当子线程修改单元格数据时如果点击了某个单元格会报错,显示{"异常来自 HRESULT:0x800AC472"},用lock在线程里锁住worksheet也不行,该如何解决?
...全文
344 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_42405356 2019-04-03
  • 打赏
  • 举报
回复
引用 6 楼 jx315425246 的回复:
[quote=引用 2 楼 以专业开发人员为伍 的回复:] 操作 Office 必须在 UI 主线程。 在子线程去做这些,你可能“偶尔会成功”,但是实际运行时通常会发现原本0.1秒做完的事情延迟到1、2秒钟才能完成,而且出错的概率从0.0001%升到10%以上。 所以根本不能考虑什么子线程。
懂不懂,你让人们说你什么好[/quote] 就是说可以子线程下载,然后把把要修改的数据传回主线程让主线程来修改是吗?这样界面会卡住么?
jx315425246 2019-04-03
  • 打赏
  • 举报
回复
在主线程中未进行操作(文件未被独享)是可以的
jx315425246 2019-03-30
  • 打赏
  • 举报
回复
进程复用了,一个EXECl操作正在执行,文件处于独享状态,你又开一个进程处理这个文件,会出这种错误,可以寻找当前进程,用当前进程进行单元格处理

bool flag=true;
string s_name = "EXCEL";
Process[] ps = Process.GetProcesses();
foreach (Process p in ps)
{
if (p.ProcessName == s_name)
{
flag=false;
//使用进程p,处理单元格
}
}
if(flag)
{
//启用EXCEL处理单元格,处理完成后退出进程
}
泡泡龙 2019-03-29
  • 打赏
  • 举报
回复
微软推荐的是RTD方案,你也可以看一下。 不明白可以联系QQ 564955427
泡泡龙 2019-03-29
  • 打赏
  • 举报
回复
你要用异步方法写入数据,excel是个sta,所以不能多线程直接写,要使用上下文。 Excel写入是个技术活,你可以学习一下exceldna的异步代码
weixin_42405356 2019-03-28
  • 打赏
  • 举报
回复
引用 2 楼 以专业开发人员为伍 的回复:
操作 Office 必须在 UI 主线程。 在子线程去做这些,你可能“偶尔会成功”,但是实际运行时通常会发现原本0.1秒做完的事情延迟到1、2秒钟才能完成,而且出错的概率从0.0001%升到10%以上。 所以根本不能考虑什么子线程。
确实在子线程里执行速度明显变慢了,也就是说将代码放在主线程里运行的时候屏幕卡住不能动才是最稳定的写法吗?
  • 打赏
  • 举报
回复
操作 Office 必须在 UI 主线程。 在子线程去做这些,你可能“偶尔会成功”,但是实际运行时通常会发现原本0.1秒做完的事情延迟到1、2秒钟才能完成,而且出错的概率从0.0001%升到10%以上。 所以根本不能考虑什么子线程。
weixin_42405356 2019-03-28
  • 打赏
  • 举报
回复
        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            Workbook wbook = Globals.ThisAddIn.Application.ActiveWorkbook; //当前活动workbook
            Worksheet worksheet = (Worksheet)wbook.ActiveSheet; //当前活动sheet
            int iColCount = worksheet.UsedRange.Rows.Count;
            SheetOptions sheet1thread = new SheetOptions(worksheet, iColCount);
            Thread othread1 = new Thread(new ThreadStart(sheet1thread.SheetToDataTable));
            //wbook.ReadOnlyRecommended;
            //worksheet.Protect("aaaaa");
            //[code=csharp][code=csharp]
[/code]worksheet.EnableSelection= XlEnableSelection.xlNoSelection; othread1.Start(); }[/code] 怎样在把worksheet传进去后锁住不让主线程操作,注释的方法都试过了解决不了

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧