我是TDD的新手,但已经使用它足够长的时间来理解如何使用模拟,存根,依赖注入,控制反转来解决"类似"问题......但由于某种原因,我对使用依赖注入感到非常不安并传入'IThread'(或类似的).
给它一些基本的上下文 - 我试图将单元测试添加到遗留应用程序,我不确定如何单元测试一个类的构造函数产生两个线程.
是使用依赖注入的唯一选择吗?
如果是这样,线程带来的功能呢?因为它代表线程都运行while(true)循环并且永远不会退出循环(除非应用程序正在终止).在循环内部有合理的代码块,这是我真正想要测试的代码.
更糟糕的是,我不想将所有功能从循环中提取到公共方法中(我只测试公共方法,因为我的测试存在于另一个项目中)因为它会真正减少类的易用性代码中的其他地方.
有什么建议?
背景
我试图将S3用作一些"无限"的大型缓存层,用于某些"相当"的静态XML文档.我想确保客户端应用程序(将同时在数千台计算机上运行并每小时多次请求XML文档)仅在客户端应用程序上次下载内容时内容发生更改时才下载这些XML文档.
途径
在Amazon S3上,我们可以使用HTTP ETAG.默认情况下,Amazon S3对象将其ETAG设置为对象的MD5哈希值.
然后,我们可以在GetObjectRequest.ETagToNotMatch属性中指定XML文档的MD5哈希值.这确保了当我们进行AmazonS3.GetObject调用时(或者在我的情况下是异步版本AmazonS3.BeginGetObject和AmazonS3.EndGetObject),如果被请求的文档具有与GetObjectRequest.ETagToNotMatch当时包含的相同的MD5哈希,则S3会自动返回HTTP状态代码304(NotModified)和实际不下载XML文档的内容.
问题
然而问题是,当调用AmazonS3.GetObject(或它是异步等效的)时,Amazon .Net API实际上将HTTP状态代码304(NotModified)视为错误,并且它重试get请求三次然后最终抛出一个Amazon.S3.AmazonS3Exception: Maximum number of retry attempts reached : 3.
显然我可以改变这个实现来使用AmazonS3.GetObjectMetaData然后比较ETAG并使用AmazonS3.GetObject它们是否匹配,但是当文件过时时,有两个请求而不是一个请求.无论XML文档是否需要下载,我都希望有一个请求.
有任何想法吗?这是一个错误还是我错过了什么?甚至有一些方法我可以将重试次数减少到一次并"处理"异常(尽管我对这条路线感到'y').
履行
我正在使用AWS SDK for .NET(版本1.3.14).
这是我的实现(稍微减少以保持更短):
public Task<GetObjectResponse> DownloadString(string key, string etag = null) {
var request = new GetObjectRequest { Key = key, BucketName = Bucket };
if (etag != null) {
request.ETagToNotMatch = etag;
}
var …Run Code Online (Sandbox Code Playgroud) 当您创建Taskwhile时,指定TaskCreationOptions.LongRunning专门为该任务创建的新线程.如果未指定,TaskCreationOptions.LongRunning则使用线程池.
如果我错了,请纠正我,但如果使用了线程池,则不需要dispose()任务(只要你没有在任务中使用任何同步对象,比如Wait()在子任务上).
如果是这种情况,我是否负责清理使用该TaskCreationOptions.LongRunning标志创建的额外线程?
如果是,则以下是可接受的模式:
var task = Task.Factory.StartNew(() => {...}, TaskCreationOptions.LongRunning);
task.ContinueWith(x => task.Dispose());
Run Code Online (Sandbox Code Playgroud)
注意如何,ContinueWith没有TaskContinuationOptions.LongRunning,所以它应该使用线程池.
尽管如此,我已经读过将任务状态移动到的线程Completed,Faulted或者Cancelled运行延续的更改.
如果有人能够对此有所启发,我将非常感激.
在AmazonS3应用程序启动后第一次使用该对象时,会有大约14秒的大延迟.所有后续呼叫都不存在这种大的时间延迟.
我之前遇到过这个与其他HTTP相关的类的确切延迟问题,并且当有问题的类试图确定本地机器的代理设置以及是否使用它们时,会导致它.
要阻止这种情况发生WebClient,你设置WebClient.Proxy = null;它并不会尝试自动检测代理设置,但我无法弄清楚如何禁用AmazonS3对象的代理检测功能.
我特意尝试设置ProxyHost为null:
_s3Client = AWSClientFactory.CreateAmazonS3Client(awsAccessKey, awsSecretAccessKey, new AmazonS3Config { ProxyHost = null });
Run Code Online (Sandbox Code Playgroud)
哪个没用.我们目前正在使用Amazon .NET SDK"v1.3.17.0".
有没有办法关闭代理检测?
我在资源文件中有30个PNG,我想在计时器内迭代它们.此计时器将表单的背景图像设置为序列中的下一个PNG,以生成基本动画.
我找不到一种简单的方法来枚举资源文件并获取实际图像.我也热衷于保持对图像的引用不固定到它们的文件名,以便更新资源文件中图像的命名不需要我更新这部分代码.
笔记:
我正在尝试编写一个中央报告工具,允许基于Windows用户登录域的时间跟踪.最初我打算创建一个小的可执行文件,它将在每台计算机上的"所有用户"启动时运行,跟踪登录的用户名并更新中央数据库.
这样做的主要问题是必须逐个机器地管理版本,并处理罕见但可能的工具在特定机器上失败的实例,而不是立即显而易见.
相反,我更愿意创建一个集中版本,但我发现MSDN和Windows SBS 2003文档很难找到答案.
基本上我想挂钩服务器上的"登录"和"注销"功能,并从那里跟踪所有信息.这里有自然延伸点吗?
很明显的替代可能是分析事件日志的信息(但是这一点我无法找到任何Windows日志,这些日志说"谁"中登录或退出).
任何有关方向或文档的指导都将非常感激.
我非常喜欢使用代码,利用IntelliSense并开放C#语言的所有功能来使用WCF,但我想确保我不会朝着最终限制WCF功能集的方向前进我可以访问.我的经验是如此受限于WCF,我不明白使用配置文件的好处,特别是如果你可以在代码中做所有事情(?).
注意:我使用的是.NET 3.5.
您能以编程方式使用WCF执行"一切"还是完整WCF功能集所需的配置文件?
我试图访问由我的WCF服务创建的单例实例,但.SingletonInstance即使在.Open调用之后似乎也为null ServiceHost.
有没有办法强制ServiceHost在第一个WCF客户端请求进入之前创建实例(可能会自动生成单例实例)?
是否有一种托管方式在我的应用程序外部的窗口上设置always on top标志/设置,还是需要P/Invoke本机功能?
如果P/Invoke是唯一的方法是什么是所需的函数调用以及从哪个dll?
我正在创建一个应用程序来监视一组选定的程序,并在需要时重新启动它们.对于这组程序,如果出现"出错"(即需要重新启动),程序将在任务管理器中显示为"无响应".
有没有办法在使用api的Windows中迭代无响应的程序?或者,假设我有窗口的进程ID或句柄,我可以查询它是否响应?