我一直在使用供应商库时遇到一些问题,当库中计算的实体应该总是在其中有效数据时,该实体偶尔会为空.
功能代码(在调试供应商问题后)大致如下:
Task.Factory.StartNew(() => ValidateCalibration(pelRectRaw2Ds, crspFeatures, Calibration.Raw2DFromPhys3Ds));
.....
private void ValidateCalibration(List<Rectangle> pelRectRaw2Ds, List<List<3DCrspFeaturesCollection>> crspFeatures, List<3DCameraCalibration> getRaw2DFromPhys3Ds)
{
var calibrationValidator = new 3DCameraCalibrationValidator();
// This is required according to vendor otherwise validationResultsUsingRecomputedExtrinsics is occasionally null after preforming the validation
GC.SuppressFinalize(calibrationValidator);
3DCameraCalibrationValidationResult validationResultUsingOriginalCalibrations;
3DCameraCalibrationValidationResult validationResultsUsingRecomputedExtrinsics;
calibrationValidator.Execute(pelRectRaw2Ds, crspFeatures, getRaw2DFromPhys3Ds, out validationResultUsingOriginalCalibrations, out validationResultsUsingRecomputedExtrinsics);
Calibration.CalibrationValidations.Add(new CalibrationValidation
{
Timestamp = DateTime.Now,
UserName = Globals.InspectionSystemObject.CurrentUserName,
ValidationResultUsingOriginalCalibrations = validationResultUsingOriginalCalibrations,
ValidationResultsUsingRecomputedExtrinsics = validationResultsUsingRecomputedExtrinsics
});
}
Run Code Online (Sandbox Code Playgroud)
验证过程是一个相当耗时的操作,所以我将其交给任务.我遇到的问题是,最初我没有调用GC.SuppressFinalize(calibrationValidator),当应用程序从Release版本运行时,out参数validationResultsUsingRecomputedExtrinsics将为null.如果我从Debug构建运行应用程序(无论是否附带调试器),那么validationResultsUsingRecomputedExtrinsics将包含有效数据.
我不完全理解GC.SuppressFinalize()在这种情况下做了什么,或者它是如何解决问题的.我能找到的关于GC.SuppressFinalize()的一切都是在实现IDisposable时使用的.我在"标准"代码中找不到任何使用它.
如何/为什么添加对GC.SuppressFinalize(calibrationValidator)的调用可以解决这个问题?
我理解,如果没有对供应商库内部的深入了解,可能无法确切知道,但任何见解都会有所帮助.
该应用程序使用针对.NET 4.0的VS2012编译.该供应商库要求在app.config中指定useLegacyV2RuntimeActivationPolicy ="true"选项.
这是我从供应商那里得到的理由:
SuppressFinalize命令确保垃圾收集器不会"提前"清理某些内容.似乎由于某种原因,你的应用程序有时让垃圾收集器有点热心并在你真正完成之前清理对象; 它几乎肯定与范围相关,并且可能是由于多线程导致校准的雾化器范围的混淆.以下是我从Engineering获得的回复.
因为变量是在本地范围内创建的,并且该函数在后台线程中运行,所以垃圾收集在主线程中运行,并且似乎垃圾收集在处理多线程情况时不够智能.有时,它只是过早发布它(验证器的内部执行尚未完成,仍然需要此变量).
我们正在构建我们的第一个小型ServiceStack实现,我们需要对位于客户端和服务器之间共享的单独程序集中的DTO进行一些澄清.
新API的WIKI页面为DTO推荐以下内容
在服务开发中,您的服务DTO提供您的技术无关服务层,您希望保持干净并尽可能"无依赖",以实现最大的可访问性和潜在的重用性.我们的建议是将您的服务DTO保存在一个单独的无部署组件中.
还有这个片段
*但是,假设您采用正常的方式复制DTO(在二进制形式的任何一个源中),因此您在客户端上有类似的东西:
[Route("/reqstars")]
public class AllReqstars : IReturn<List<Reqstar>> { }
The code on the client now just becomes:
var client = new JsonServiceClient(BaseUri);
List<Reqstar> response = client.Get(new AllReqstars());
Run Code Online (Sandbox Code Playgroud)
这是对/ reqstars路由的GET Web请求.当客户端上不存在自定义路由时,它会自动回退到使用ServiceStack的预定义路由.
我的问题是......由于DTO类的路由属性,"大部分免费"程序集是否还需要依赖ServiceStack?
是否可以使用反射从程序集中检索所有字符串文字值?
让我们说我有这个课程:
public class Example
{
public void PrintName()
{
Debug.Print(@"My name is Dave");
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用反射来获取应用程序中的字符串列表,如字符串"我的名字是戴夫".
如果将字符串分配给变量,而不是内联文字,我已经找到了如何执行此操作.