C#学习总结:可能是近期最后一篇技术日志了

7月27日  星期一    天气晴

 

已经接近下班时间了。今天做了一天的查漏补缺工作。因为我知道,我的技术生涯又可能要暂告一段落了。所以要抓紧机会,总结一下这三个星期的技术学习历程。

 

回忆呢,也要一步一步来:

7月8日是第一天: 了解了项目的整体结构和各个模块。写了一个窗体,熟悉了一下C#

7月9--10日:写备份类,用了大约1天的时间去了解SQLDMO对象的使用和编写,结果一直报错,最后才发现SQLDMO是利用数据库的备份API来做的,一来跟需要不吻合,二来也有很多错误,权衡一下,决定自己来写备份类,写到二进制文件里面。

       ----------------这里时间花得太多了。学习一个SQLDMO最多用一个时间就够了。第二点是发现问题的时间太长,应该可以冷静一点去思考,为什么无法访问某个路径。冷静地想一下可能的疑点,就可以迅速地找到问题所在。想想找车的经历。

7月11日:该周最后一个工作日,整天主要花在自定义备份类的设计上了。思路变化了许多,一开始是打算直接序列化LINQ对象,结果发现反序列化只可以得到一个大对象。。。。然后又想写入一个ArrayList,这也是有的人想的方法,但是由于需要跟进度栏挂钩,所以也放弃了这种方法。后来又找到一种方法,网上的提示,就是将对象序列化成字节流,写在内存中,然后再将字节数组写到二进制文件中。这个方法可以。但是试行的时候又遇到问题了:找不到序列化要用的类。。。真见鬼了。不过这里也要怪自己,一点都不冷静,遇到引用的问题,应该去找引用啊。如果引用里面找不到,再去找文件。冷静,一定要冷静。

7月13日:这一天主要就是做了一个备份和还原类的Demo,注意啊,备份只是备份一个数据表的内容,而还原并没有将对象写入数据库的部分的。这个居然用了一整天啊。看来做Demo还是要紧张点,注意时间,估计2-3个小时完全可以做出来的。当然,还包括了对一些BUG的修复,类似文件保存对话框的BUG,这种BUG实在看起来太恶心了。所以一定要注意不要被表象所影响,一切从内部看起,看内核。

7月14日:开始完善整个备份类,开始第一步是使用Type容器来装载所有表类型。早上花了两个小时来写类型的序列化与反序列化。(Demo时间花得还是太长了)然后是往容器里面添加类。这个是体力活,时间活。下午5点发现问题,无法使用类型来调用属于这个类型的对象方法。半个小时后,问题得到了解决,动态泛型方法的调用,可以用反射技术来解决。半个小时解决一个未遇过的问题,这应该是标准的时间吧。

7月15日:早上10点多顺利解决了备份类中备份泛型表的问题,之后的2个小时用来写日志了。。。。。。(感觉在这上面也花了不少时间啊,不过值得)  下午有点荒废了,去弄数据库连接的事情,结果是无功而返,到现在还没有弄好。当时的思路是要做恢复和删除操作,因此必须要将数据库转移到本地。这个策略是正确的,但是就没有贯彻到底,导致了后面的一系列问题。冷静地思考策略和计划,不然就会做很多无用功。这点必须切记。

7月16日:早上花了2个小时将备份类的泛型方法调用写完(这个时间花的还是久了一些),之后去考虑LINQ写入数据库的问题。事实上,LINQ跟Hibernate有异曲同工之妙,如果我对Hibernate熟悉一些,肯定不至于要花那么长的时间去理解LINQ的写入。不过当天早上的学习还是有意义的,知道了LINQ使用扩展方法,委托,r表达式等一系列灵活的方法来实现抽象的数据库应用。下午测试数据库的写入,结果导致了服务器上面的数据库出现了异常数据。。。从而导致了接下来3-4天的提心吊胆,当天就已经总结了,凡是以后作数据库更改操作,一定要在本地做,调试过没问题再放到服务器上。

 ------------我虽然忘记了这一天具体的心情,但是可以肯定是出现过焦虑和沮丧的,这是编程过程中经常发生的问题,焦虑源于自己进度之慢,沮丧源于同伴进度之快。但是心情越不放松,越是难以超越,这一点必须牢记!

7月17日:今天开始了晨早计划日志,即早上想好要做什么。(其实这个可以在跑步的时候想清楚,不是吗?)。这是一个不错的习惯,但是往往进度赶不上计划,令自己有挫败感。当天的计划是做会员信息导出那一块。因为发现要导出的格式是Access数据库,则自定义的二进制文件派不上用场,遂感到任务又多了一份。早上将创建数据库的Demo做好了,问题是发现使用LINQ读取数据库信息的部分,自己还不十分清楚,结果顺便连ADO.NET也看了一下。(不过看了用处不大,还是要用过才是自己的)下午花了些时间写日志。然后就迷失在LINQ的JOIN语句中了。后来还是使用Where子句直接搞掂跨表查询的。做好读出信息之后,又发现自己连INSERT语句都不知道怎么写。。。。。基础啊基础啊,真是让我痛心疾首。而且这里我也注意到,一定要善于在网上发掘答案。这个技术无比重要。又一周过去了,这一周基本上就是完成了备份类的总体架构,感觉上应该完成了80%以上的工作了,估计下周再有2天就可以完成。事实上,还用了一整周的时间,才完善的整个备份向导模块。

7月20日:这一天主要来解决业务数据备份模块的问题。但是看回日志的时间记录。9点开始上班,10:47才开始真正做业务数据备份呢。这里面时间流失太严重! 花了一整天的时间来完成业务数据备份,这个当然超出了计划预算,但是客观原因也存在,因为业务数据备份有不同的需要,需要根据条件来选择数据然后备份,这必然与基础数据的整体数据表备份有不同之处。

  ------------------考虑这个问题,我必须承认自己在程序设计过程中表现出来的急功近利和不成熟。在设计备份类的时候必须从全局出发来考虑这个类的设计,而不能仅仅为了做出点东西,而直接按照局部的需求来编码,最终结果肯定是反复的重构和重新设计。把脚步放慢,是为了走得更快!

7月21日:这一天应该是这段时间以来最沮丧失落的一天了。由于心情低落,基本上没有心思做事,所谓的纠结就是了。后来强撑着做了一些小修小改以及删除操作,结果又发现不小心将服务器上面的数据删除了。(其实星期一我已经将数据库转移到本地了,然而由于自己的疏忽,没有注意连接字符串没有修改,结果是这几天一直都是连着服务器上面的数据库)。。。。。。真的就是乱成一团。还好下午4点多的时候能够及时稳住阵脚,采取了有效的补救措施,才避免了情况的恶化和自己的进一步凌乱。不过正是这样的事故这样才能练就自己的心,时时保持冷静,宽和。

7月22日:这一天算是拨乱反正,完成删除向导,然后就是整个备份删除模块的整合测试。(当然,那时还没有解决窗体容易无法响应而且取消按钮无反应的问题)。

7月23日:花了一个早上的时间来将代码通过TeamServer上传到服务器上,并进行了合并。从下午开始做多线程方面的工作。

7月24日:记得这一天非常痛苦,调试的时候调到调试点不知道跑哪里去了。。。。只能一句一句地找错误。最后在6点下班前,突然灵光一闪,发现问题所在。这一天最大的收获就是当遇到不能解决的问题时,可以去放松一下心情,换一下脑子,然后答案就会跑到你面前了。

7月25日:周六,本周的最后一天,完善线程操作的其他问题。比如线程的挂起和恢复。暂时还是使用已废弃的Suspend和Resume方法,暂时找不到更好的方法。还有的就是完成了多线程编程的日志。

最终统计一下:

第一周:熟悉系统,完成向导框架,完成了基于SQLDMO的备份模块,初步设计了自定义的系统类

第二周:核心周,完成备份/恢复类的整体结构以及80%左右的代码。

第三周:前三天,主要完成备份恢复向导的剩余工作; 后三天:添加多线程,修正取消按钮不响应的Bug。

 

总体来说,为期约3周的C#开发令自己学习到了许多新的知识,起码对C#和.NET语言有了新的认识,这样一来,我知识领域中的盲区又少了一个。相信对我日后的开发是很有帮助的。

对备份恢复向导模块的开发,涉及的技术包括了LINQ to SQL, 序列化,IO,多线程。知识也挺杂挺乱。必须得好好消化。比较可惜的是自己仍然没有对信息管理软件的核心——数据库读写有深入的认知,即负责一个主要管理模块,也没有对权限模块进行认知,这是最为可惜的地方。

需要知道的一点是,虽然自己的开发能力又有了一些提升(比做毕业设计的时候),但是还是离要求有一段不小的距离。当然,这个是需要用不断的开发来锻炼提高的。

今天先总结道这里,以后有想到的再补充。

 

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
您可以使用Blazor WebAssembly或Blazor Server来展示日志。下面是一些实现方式: 1. 使用Blazor WebAssembly 您可以将日志作为对象注入到您的服务中,然后将其绑定到UI组件以显示。以下是一个示例: 在Startup.cs文件中,注入日志服务: ```csharp services.AddSingleton<ILoggerService, LoggerService>(); ``` 创建LoggerService类,该类包含记录日志的方法: ```csharp public class LoggerService : ILoggerService { private List<LogEntry> logs = new List<LogEntry>(); public void Log(string message) { logs.Add(new LogEntry { Message = message, Timestamp = DateTime.Now }); } public List<LogEntry> GetLogs() { return logs; } } public class LogEntry { public string Message { get; set; } public DateTime Timestamp { get; set; } } ``` 在Blazor组件中,绑定日志数据: ```csharp @page "/log" <h3>Log</h3> <ul> @foreach (var log in logs) { <li>@log.Timestamp.ToString() - @log.Message</li> } </ul> @code { private List<LogEntry> logs; protected override void OnInitialized() { logs = loggerService.GetLogs(); } [Inject] private ILoggerService loggerService { get; set; } } ``` 2. 使用Blazor Server 在Blazor Server中,您可以使用SignalR连接到服务器,然后通过SignalR获取日志数据。以下是一个示例: 在Startup.cs文件中,注入日志服务: ```csharp services.AddSingleton<ILoggerService, LoggerService>(); ``` 创建LoggerService类,该类包含记录日志的方法: ```csharp public class LoggerService : ILoggerService { private List<LogEntry> logs = new List<LogEntry>(); public void Log(string message) { logs.Add(new LogEntry { Message = message, Timestamp = DateTime.Now }); } public List<LogEntry> GetLogs() { return logs; } } public class LogEntry { public string Message { get; set; } public DateTime Timestamp { get; set; } } ``` 在Blazor组件中,使用SignalR获取日志数据: ```csharp @page "/log" <h3>Log</h3> <ul> @foreach (var log in logs) { <li>@log.Timestamp.ToString() - @log.Message</li> } </ul> @code { private List<LogEntry> logs; protected override async Task OnInitializedAsync() { logs = await hubConnection.InvokeAsync<List<LogEntry>>("GetLogs"); } [Inject] private HubConnection hubConnection { get; set; } } ``` 在服务端创建SignalR Hub,该Hub将日志数据发送到客户端: ```csharp public class LogHub : Hub { private readonly ILoggerService loggerService; public LogHub(ILoggerService loggerService) { this.loggerService = loggerService; } public async Task<List<LogEntry>> GetLogs() { return loggerService.GetLogs(); } } ``` 在Startup.cs文件中,配置SignalR: ```csharp services.AddSignalR(); app.UseEndpoints(endpoints => { endpoints.MapHub<LogHub>("/loghub"); }); ``` 请注意,这只是展示日志的基本示例,您可能需要根据您的实际需求进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值