##1 页面突然不显示
如果是连Menu都无法加载,很有可能是配置文件出问题了
###问题原因
别人更改了远程的配置文件(远程的拥有最大的版本号),并且适配的修改了代码,但你本地的代码并没有做适配性修改,而且每次运行的时候你都会拉取远程配置文件覆盖本地配置文件,这就导致代码和配置文件不匹配。
###解决方案
两种情况,总之要保证代码和配置文件的一致性:
- 如果还需要在本地调试,不需要远程代码,把本地的配置文件版本号改大(超级大),这样远程的配置文件就不会自动下载了。
- 如果不需要本地调试,就获取最新的代码去匹配配置文件
第一种为推荐做法。当然当你修改完代码,要上传配置文件的时候,把超级大的配置文件版本号改回只比远程目前最新的大一号就行啦
##2 VS多线程调试断点无法命中
在多线程代码中:
Task task = Task.Factory.StartNew( () => { });
###问题原因
在多线程内部的代码,打了断点,却无论如何都不能命中断点(无论是从单元测试还是直接从网页执行),这是因为你当前命中断点是一个线程,代码却从另一个线程溜了。
###解决方案
调试的过程中先注释掉多线程部分代码,断点执行逻辑就可以了。
##3 从git仓库clone下来的代码为什么报引用错误
这个问题很显然的现象是,明明看到引用了,但还是老报没有引用的错误,而你又没法再次引用,很尴尬。
###问题原因
问题很可能是版本不一致的问题啦。
###解决方案
1,如果你删过之前的项目而没有连同package一并删除,那么很有可能包的引用已经在远端被人改变,和你本地的不兼容,所以小伙子,尝试下还原NuGet包吧
2,如果方法一不能解决,那么定位哪个package有问题,删除出去,然后再从还原后的NuGet包附加的package里重新添加该dll
##4 代码报no reference错误
这个时候最常见的就是空引用的问题。
###问题原因
常见场景是从数据库或者通过某个方法取一个对象,但由于参数或者其它问题,取到的对象为null值,假设这个对象为:
- 字典类TML,使用key取值的时候TML[key],就会抛出异常,导致程序中断
- 字符串TML,如果调用TML.splite(’.’)或者类似方法的时候,也会抛出异常,导致程序中断
###解决方案
大多数场景,从一个地方拿到一个对象要使用的时候,一定要提前判断该对象是否为null(如果为null采用别的处理方法),如果为null就打印出错误信息,这样不会导致程序中断
if (!string.IsNullOrEmpty(TML)) { string appName = TML.Split('.')[0]; string entityName = TML.Split('.')[1]; } else { logger.Error("执行失败,TML值取到为null"); }
##5 上下文取不到值了
场景是:在多线程中使用上下文
###问题描述
我们存好上下文后,就觉得全局取用万无一失了,事实上,上下文虽然在全局生效,但是如果你使用了多线程:
前提条件是有个上下文存储应用名。
var appname = ImplementContext.Current.AppName;
function()是这个样子的
function(){ var appName = ImplementContext.Current.AppName;//这里的appName实际为0;取不到 }
###问题原因
在多线程内部执行的某一个函数,执行过程中,需要赋值操作。
Task task = Task.Factory.StartNew( () => { function() });
###解决方案
实际操作的时候应该在线程内再给上下文赋一次值,
Task task = Task.Factory.StartNew( () => { ImplementContext.Current.AppName=appName; //需要再赋一次值 function(appName) //这里可以用 });