问题描述
我的程序中使用到了backgroundWorker控件,当窗体加载的时候就使用这控件进行读取XML文件,防止假死,而且我需要开机启动此程序,现在的问题是,我开机时,的确启动了本程序,但是,却读取不了xml配置文件,我使用了System.Threading.Thread.Sleep(10000),这样也不行,但是开机后,用手动启动是完全正常的,这是怎么回事啊?开机启动类如下#region开机启动类classRegister{///<summary>///开机启动注册表检查///</summary>publicvoidstart_with_windows(){RegistryKeyhklm=Registry.LocalMachine;RegistryKeyrun=hklm.OpenSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionRun",true);//未设置开机启动if(run.GetValue("CheckWorkAttendance")==null){register();}}///<summary>///将程序的开机启动写入注册表///</summary>privatevoidregister(){stringstarupPath=Application.ExecutablePath;//classMicosoft.Win32.RegistryKey.表示Window注册表中项级节点,此类是注册表装.RegistryKeyloca=Registry.LocalMachine;RegistryKeyrun=loca.CreateSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionRun");try{run.SetValue("CheckWorkAttendance",starupPath);//MessageBox.Show("注册表添加成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);loca.Close();run.Close();}catch(Exceptionee){MessageBox.Show(ee.Message.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);}}}#endregion
处理代码:privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkEventArgse)//异步执行代码{#region异步执行代码BackgroundWorkerworker=(BackgroundWorker)sender;//获取异步对象try{//读取机器连接数据XmlDataDocumentxm=newXmlDataDocument();xm.Load("Service.xml");//读属性XmlNodeListxs=xm.GetElementsByTagName("Equipment");//获取XML中的根节点XmlNodeListxs1=xm.GetElementsByTagName("connectionString");//读取XML中的连接字符串XmlNodenode=xs1.Item(0);MethodOperation.connectionString=node.ChildNodes[0].Attributes["value"].Value;//根据value获取对应的值intjiqiCount=xs.Count;value=100/jiqiCount;//分配进度条宽度for(inti=0;i<jiqiCount;i++)//循环个数{AttendanceMachineModleattinfo=newAttendanceMachineModle();//创建终端对象foreach(XmlNodeainxs.Item(i)){if(a.Name=="Number"){attinfo.DwMachineNumber=int.Parse(a.InnerText);}if(a.Name=="IP"){attinfo.Ip=a.InnerText;}if(a.Name=="Port"){attinfo.Port=int.Parse(a.InnerText);}}zkemkeeper.CZKEMClassCinfo=newzkemkeeper.CZKEMClass();//创建机器对象if(!worker.CancellationPending){worker.ReportProgress(i+1,null);}attinfo.IsConnect=Cinfo.Connect_Net(attinfo.Ip,attinfo.Port);//对遍历的终端进行连接操作if(!worker.CancellationPending){worker.ReportProgress(i+1,attinfo.IsConnect.ToString());}//调用异步通知MethodOperation.lCZKEMClass.Add(Cinfo);//将机器对象加入至机器对象集合MethodOperation.lAttendanceMachine.Add(attinfo);//将机器终端加入至终端集合}XmlNodeListxmllist=xm.GetElementsByTagName("Time");//获取程序定时更新考勤数据时间根节点XmlNodexml=xmllist.Item(0);inth=0;intm=1;foreach(XmlNodeiteminxml.ChildNodes){if(item.Name=="Hour"){h=int.Parse(item.InnerText);}elseif(item.Name=="Minute"){m=int.Parse(item.InnerText);}}stringtime="1999-01-01"+h+":"+m+":00";MethodOperation.Time=DateTime.Parse(time);//读取完后并进行保存MethodOperation.Synchronization();//数据都读取完成后,调用更新数据函数,此函数将机器中的数据读取出来和数据库中的数据进行对比,没有的且日期大的考勤数据进行保存}catch(Exceptionex){e.Result=ex;}#endregion}
解决方案
解决方案二:
我觉得你还是加个日志,把每一步记录下来,看看为什么没读xml,运行到了那一步,这样方便查找问题
解决方案三:
我也遇到过这样的问题,哈哈,是因为路径问题。系统自启动的时候会导致读取文件路径不对,自己填写绝对路径吧。还不能用函数获取路径。。。。。。
解决方案四:
路径问题,一般用快捷方式即可解决,不要直接访问远程序,因为快捷方式本身带有起始位置的设置,那个默认就是应用程序当前目录,除非你吃饱了没事去乱改。
解决方案五:
引用2楼knna_的回复:
我也遇到过这样的问题,哈哈,是因为路径问题。系统自启动的时候会导致读取文件路径不对,自己填写绝对路径吧。还不能用函数获取路径。。。。。。
试了。没用呀,而且手动填写死了,绝对路径不行呀
解决方案六:
引用3楼qldsrx的回复:
路径问题,一般用快捷方式即可解决,不要直接访问远程序,因为快捷方式本身带有起始位置的设置,那个默认就是应用程序当前目录,除非你吃饱了没事去乱改。
我在桌面创建了快捷方式,然后怎么将此快捷方式加入到开机启动项?右键属性那路径就是该程序,还是一样的
解决方案七:
引用4楼caowei380的回复:
引用2楼knna_的回复:我也遇到过这样的问题,哈哈,是因为路径问题。系统自启动的时候会导致读取文件路径不对,自己填写绝对路径吧。还不能用函数获取路径。。。。。。试了。没用呀,而且手动填写死了,绝对路径不行呀
比如你的配置文件是在D盘的config文件夹下。路径就写D:\config\test.config这样都不能读取?