C#技巧【调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法】【C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件”的解决】

SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.sydtek.com/

调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法

摘录于:http://blog.csdn.net/u011549779/article/details/53388795

 

这个问题出现的原因主要是线程间的访问限制导致的,如果想要访问可以通过委托来进行访问

 this.userModeControl.Dispatcher.Invoke(
                            new Action(
                                delegate
                                {
                                    this.userModeControl.IsEnabled = true;
                                }

                                ));

解析:

 

出现上面的异常是因为多个线程在同时访问一个对象造成的,在网上查看了一些资料,说的是在C#2005后不再支持多线程直接访问界面的控件(界面创建线程与访问线程不是同一个线程),但是可以可以使用delegate来解决。
  相应的解决方法如下:
  WPF:Dispatcher.Invoke 方法,只有在其上创建 Dispatcher 的线程才可以直接访问DispatcherObject。若要从不同于在其上创建 DispatcherObject 的线程的某个线程访问 DispatcherObject,请对与 DispatcherObject 关联的 Dispatcher 调用 Invoke 或 BeginInvoke。需要强制线程安全的 DispatcherObject 的子类可以通过对所有公共方法调用 VerifyAccess 来强制线程安全。这样可以保证调用线程是在其上创建 DispatcherObject 的线程。
  代码:  this.lbl.Dispatcher.Invoke(new Action(()={ this.lbl.Text = this is a test!!!; }));
  this.lbl.Dispatcher.Invoke(new Action(()={ this.lbl.Text = this is a test!!!; }));
  Winfrom:Control.Invoke 方法 (Delegate),在拥有此控件的基础窗口句柄的线程上执行指定的委托。
  代码:  this.lbl.Invoke(new Action(()={ this.lbl.Text = this is a test!!!; }));
  所以可以按照下面这样(修改theout方法的内容)来解决刚才的问题:
publicvoidtheout(objectsource,System.Timers.ElapsedEventArgse){this.gcc1.Dispatcher.Invoke(newAction(delegate{if(this.gcc1.Offset<1){this.gcc1.Offset+=0.1;}else{this.gcc1.Offset=0;}}));this.gcc2.Dispatcher.Invoke(newAction(delegate{if(this.gcc2.Offset<1){this.gcc2.Offset+=0.1;}else{this.gcc2.Offset=0;}}));}  这样就可以解决调用线程无法访问此对象,因为另一个线程拥有该对象的问题

 

C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件”的解决

 

摘录于:http://blog.csdn.net/chenhao0568/article/details/77676965

 

我发现excel最新的扩展名.xlsx不用打开文件在计算机里就可以直接搜里面的内容。但老的.xls就搜不到。

 

1.C#写的操作EXCEL应用 提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件。 之前还正常,换个电脑就报错。

先手工打开Excel,会提示“受保护的视图”,不能编辑。点启用编辑就行了。再打开软件,正常了。

 

2.找不到引用microsoft.office.core

在项目引用中右击选择添加引用,选择COM里面选择Microft Office 12.0 object Library和Microft Excel 12.0 object Library分别点确定即可!同样如果要引用World选Microft World 12.0 object Library!  2003/2007共通处理方式 分别为11或12版本  添加.net中Microsoft.Office.Interop.excel;  添加.net中Office 

 

3.源码示例

[csharp] view plain copy

  1. using System;  
  2. using System.Reflection;  
  3. using System.IO;  
  4. using Microsoft.Office.Interop.Excel;  
  5.   
  6. namespace Excel  
  7. {  
  8.     class Excel  
  9.     {  
  10.         public static int startRow =5;  
  11.         public static string jzmc = "";  
  12.         public static string id = "";  
  13.         public static Double count = 0;  
  14.         public static Array zw;  
  15.         public static bool WriteXls(string filename, System.Collections.ArrayList rowData, int sheetNum)  
  16.         {  
  17.             //启动Excel应用程序  
  18.             Microsoft.Office.Interop.Excel.Application xls = new Microsoft.Office.Interop.Excel.Application();  
  19.           //  _Workbook book = xls.Workbooks.Add(Missing.Value); //创建一张表,一张表可以包含多个sheet  
  20.   
  21.             //如果表已经存在,可以用下面的命令打开  
  22.             _Workbook book = xls.Workbooks.Open(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);  
  23.   
  24.             _Worksheet sheet;//定义sheet变量  
  25.             xls.Visible = false;//设置Excel后台运行  
  26.             xls.DisplayAlerts = false;//设置不显示确认修改提示  
  27.   
  28.             //创建并写入数据到sheet  
  29.             try  
  30.             {  
  31.                 sheet = (_Worksheet)book.Worksheets.get_Item(sheetNum);//获得第i个sheet,准备写入  
  32.             }  
  33.             catch (Exception ex)//不存在就增加一个sheet  
  34.             {  
  35.                 sheet = (_Worksheet)book.Worksheets.Add(Missing.Value, book.Worksheets[book.Sheets.Count], 1, Missing.Value);  
  36.             }  
  37.             //sheet.Name = "第" + i.ToString() + "页";//设置当前sheet的Name  
  38.             sheet.get_Range("C3", Type.Missing).Cells.Value2=jzmc;  
  39.             sheet.get_Range("G3", Type.Missing).Cells.Value2=id;  
  40.             sheet.get_Range("I3", Type.Missing).Cells.Value2=count;  
  41.   
  42.              
  43.             for (int offset = 0; offset < 10; offset++)  
  44.             {  
  45.                 string str = rowData[offset].ToString();  
  46.                 sheet.Cells[startRow, offset + 1] = rowData[offset].ToString();   
  47.                  
  48.             }  
  49.             startRow++;//行位置向前加      
  50.            
  51.   
  52.             //将表另存为  
  53.           //  book.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);  
  54.   
  55.             //如果表已经存在,直接用下面的命令保存即可  
  56.             book.Save();  
  57.   
  58.             book.Close(false, Missing.Value, Missing.Value);//关闭打开的表  
  59.             xls.Quit();//Excel程序退出  
  60.             //sheet,book,xls设置为null,防止内存泄露  
  61.             sheet = null;  
  62.             book = null;  
  63.             xls = null;  
  64.             GC.Collect();//系统回收资源  
  65.             return true;  
  66.         }  
  67.         public static bool CreateFile(string filename)  
  68.         {  
  69.             try  
  70.             {  
  71.                 //启动Excel应用程序  
  72.                 Microsoft.Office.Interop.Excel.Application xls = new Microsoft.Office.Interop.Excel.Application();  
  73.                 _Workbook book = xls.Workbooks.Add(Missing.Value); //创建一张表,一张表可以包含多个sheet  
  74.                 xls.DisplayAlerts = false;//设置不显示确认修改提示  
  75.                 //将表另存为  
  76.                 book.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);  
  77.                 book.Close(false, Missing.Value, Missing.Value);//关闭打开的表  
  78.                 xls.Quit();//Excel程序退出  
  79.                 //sheet,book,xls设置为null,防止内存泄露  
  80.                 xls = null;  
  81.                 GC.Collect();//系统回收资源  
  82.             }  
  83.             catch (Exception ex)//不存在就退出  
  84.             {  
  85.                 return false;  
  86.             }  
  87.             return true;  
  88.         }  
  89.         public static Array ReadXls(string filename, int index)//读取第index个sheet的数据  
  90.         {  
  91.             //启动Excel应用程序  
  92.             Microsoft.Office.Interop.Excel.Application xls = new Microsoft.Office.Interop.Excel.Application();  
  93.             //打开filename表  
  94.             _Workbook book = xls.Workbooks.Open(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);  
  95.   
  96.              try  
  97.             {  
  98.                     _Worksheet sheet;//定义sheet变量  
  99.                     xls.Visible = false;//设置Excel后台运行  
  100.                     xls.DisplayAlerts = false;//设置不显示确认修改提示                
  101.                     sheet = (_Worksheet)book.Worksheets.get_Item(index);//获得第index个sheet,准备读取  
  102.             
  103.                     Console.WriteLine(sheet.Name);  
  104.                     int row = sheet.UsedRange.Rows.Count;//获取不为空的行数  
  105.                     int col = sheet.UsedRange.Columns.Count;//获取不为空的列数  
  106.   
  107.                     jzmc = sheet.get_Range("C3", Type.Missing).Cells.Value2;  
  108.                     id = sheet.get_Range("G3", Type.Missing).Cells.Value2;  
  109.                     count = sheet.get_Range("I3", Type.Missing).Cells.Value2;  
  110.                     zw = (Array)sheet.get_Range("B5", "B" + row).Cells.Value2;  //获得区域数据赋值给Array数组,方便读取  
  111.                     Array value = (Array)sheet.get_Range("A5", "F" + row).Cells.Value2;  //获得区域数据赋值给Array数组,方便读取  
  112.   
  113.                     // Array value = (Array)sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[row, col]).Cells.Value2;  
  114.   
  115.                     book.Save();//保存  
  116.                     book.Close(false, Missing.Value, Missing.Value);//关闭打开的表  
  117.                     xls.Quit();//Excel程序退出  
  118.                     //sheet,book,xls设置为null,防止内存泄露  
  119.                     sheet = null;  
  120.                     book = null;  
  121.                     xls = null;  
  122.                     GC.Collect();//系统回收资源  
  123.                     return value;  
  124.                }  
  125.              catch (Exception ex)//不存在就退出  
  126.              {  
  127.                  book.Close(false, Missing.Value, Missing.Value);//关闭打开的表  
  128.                  xls.Quit();//Excel程序退出  
  129.                  //sheet,book,xls设置为null,防止内存泄露  
  130.                  
  131.                  book = null;  
  132.                  xls = null;  
  133.                  GC.Collect();//系统回收资源  
  134.                  return null;  
  135.              }  
  136.           
  137.               
  138.         }  
  139.         public static void Copy(string path, string path2)  
  140.         {  
  141.             //string path = @"c:/temp/MyTest.txt";  
  142.            // string path2 = path + "temp";  
  143.   
  144.             try  
  145.             {  
  146.                 // Create the file and clean up handles.  
  147.                // using (FileStream fs = File.Create(path)) { }  
  148.   
  149.                 // Ensure that the target does not exist.  
  150.                 File.Delete(path2);  
  151.   
  152.                 // Copy the file.  
  153.               //  File.Copy(path, path2);  
  154.               //  Console.WriteLine("{0} copied to {1}", path, path2);  
  155.   
  156.                 // Try to copy the same file again, which should succeed.  
  157.                 File.Copy(path, path2, true);                 
  158.               //  Console.WriteLine("The second Copy operation succeeded, which was expected.");  
  159.             }  
  160.   
  161.             catch  
  162.             {  
  163.                // Console.WriteLine("Double copy is not allowed, which was not expected.");  
  164.             }  
  165.         }  
  166.        public static void Test()  
  167.         {  
  168.             string Current;  
  169.             Current = Directory.GetCurrentDirectory();//获取当前根目录  
  170.             Array Data = ReadXls(Current + "\\JMO-PCBA-019.xls", 1);//读取test.xls的第一个sheet表  
  171.             foreach (string temp in Data)  
  172.                 Console.WriteLine(temp);  
  173.             Console.ReadKey();  
  174.         }  
  175.     }  

 

你可能感兴趣的:(C#技巧【调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法】【C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件”的解决】)