我正在开发一个应用程序,最终将成为推动WPF应用程序UI测试的API.
在我们正在进行的初始测试的一个点上,我们得到2个Windows安全弹出窗口.我们有一些循环10次的代码,它使用FindWindowByCaption方法获取其中一个弹出窗口的句柄并输入信息并单击确定.
10次中有9次可以正常运行,但我们偶尔会看到看起来像是一场比赛的情况.我的怀疑是,当只有一个窗口打开时,循环开始,而当它输入信息时,第二个窗口打开并窃取焦点; 在此之后它只是无限期地挂起.
我想知道的是,如果有任何方法来获取给定标题的所有窗口句柄,那么我们可以等到2开始循环之前.
在我的C#WinForms应用程序中,我有一个隐藏其默认控件的主窗口.
所以为了让我能够移动它,我将以下内容添加到主窗口:
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
private const int WM_NCLBUTTONDBLCLK = 0x00A3;
protected override void WndProc(ref Message message)
{
if (message.Msg == WM_NCLBUTTONDBLCLK)
{
message.Result = IntPtr.Zero;
return;
}
base.WndProc(ref message);
//Allow window to move
if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
message.Result = (IntPtr)HTCAPTION;
}
Run Code Online (Sandbox Code Playgroud)
我有一个WPF应用程序,我也隐藏了默认控件,我想做同样的事情.我看到主窗口是从'Window'派生的,所以上面的代码不起作用.我如何在WPF中执行此操作?
我正在努力在我们的服务中实现AutoMapper,并且在我们的单元测试中看到了一个非常令人困惑的问题.
首先,此问题涉及以下对象及其各自的映射:
public class DbAccount : ActiveRecordBase<DbAccount>
{
// this is the ORM entity
}
public class Account
{
// this is the primary full valued Dto
}
public class LazyAccount : Account
{
// this class as it is named doesn't load the majority of the properties of account
}
Mapper.CreateMap<DbAccount,Account>();
//There are lots of custom mappings, but I don't believe they are relevant
Mapper.CreateMap<DbAccount,LazyAccount>();
//All non matched properties are ignored
Run Code Online (Sandbox Code Playgroud)
它也涉及这些对象,但此时我还没有使用AutoMapper映射这些对象:
public class DbParty : ActiveRecordBase<DbParty>
{
public …
Run Code Online (Sandbox Code Playgroud) 我正在努力将我们的项目从.Net 2升级到.Net4.5,同时我正在向NuGet推送尽可能多的引用,并确保版本是最新的.
我在运行其中一个测试时遇到问题
测试类:
public class Person
{
public static int PersonBaseMethodHitCount { get; set; }
public virtual void BaseMethod()
{
PersonBaseMethodHitCount = PersonBaseMethodHitCount + 1;
}
public static int PersonSomeMethodToBeOverriddenHitCount { get; set; }
public virtual void SomeMethodToBeOverridden()
{
PersonSomeMethodToBeOverriddenHitCount = PersonSomeMethodToBeOverriddenHitCount + 1;
}
}
public class Employee : Person
{
public static int EmployeeSomeMethodToBeOverriddenHitCount { get; set; }
public override void SomeMethodToBeOverridden()
{
EmployeeSomeMethodToBeOverriddenHitCount = EmployeeSomeMethodToBeOverriddenHitCount + 1;
}
public static int EmployeeCannotInterceptHitCount { get; set; } …
Run Code Online (Sandbox Code Playgroud) 我在我的角度应用程序上连接一个状态栏,目的是当向服务器发出请求时,栏会显示响应消息,将有一个背景颜色来表示成功或错误,以及是否成功隐藏之后几秒钟.
我所看到的是,在加载页面后第一次运行此逻辑时,动画未运行(淡入和定时淡出都无法运行),但仅当状态栏元素最初被隐藏时,如果我设置在页面加载时ng-show变量为true所有动画都按预期工作.
我确实通过chrome的开发人员工具检查了源代码,在第一次运行期间,div alert-bar ng-hide-remove ng-hide-remove-active alert-bar-success ng-animate ng-hide
应该在完成动画之后有这些类.当动画确实有效时,唯一存在的类是alert-bar alert-bar-success ng-animate ng-hide
.
HTML:
<div class="alert-bar" ng-show="response.show" ng-class="(response.result == true) ? 'alert-bar-success' : 'alert-bar-danger'">
<div class="container">
<label>Message: {{response.message}}</label>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS:
.alert-bar {
width: 100%;
margin-top: -20px;
margin-bottom: 20px;
}
.alert-bar-success {
background-color: #5cb85c;
border-color: #4cae4c;
color: #ffffff;
}
.alert-bar-danger {
color: #ffffff;
background-color: #d9534f;
border-color: #d43f3a;
}
.alert-bar.ng-hide-add, .alert-bar.ng-hide-remove {
-webkit-transition:all linear 0.3s;
-moz-transition:all linear 0.3s;
-o-transition:all linear 0.3s;
transition:all linear 0.3s;
display:block!important;
}
.alert-bar.ng-hide-add.ng-hide-add-active,
.alert-bar.ng-hide-remove { …
Run Code Online (Sandbox Code Playgroud) 我的问题与这个问题有关,但有点具体.
我有一个域对象Customer
,如下所示:
public class Customer : Party
{
public Identity Identity {get; protected set;}
public bool IsOrganization {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
和身份看起来像这样:
public class Identity : PersistableModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleInitial { get; set; }
public string Title { get; set; }
public string BusinessName { get; set; }
public string LegalName { get; set; }
public bool IsSynchronized { get; private set; …
Run Code Online (Sandbox Code Playgroud) 我将在声明前面提出这个问题:我知道以下是糟糕的设计,但重构目前不是一个选项,理想情况下应该使用拦截器完成.
我正在努力将城堡从1.6(我认为)升级到3.3,遗憾的是它涉及一些语法更改,我现在已经编译了所有内容,但我在服务容器周围的一些测试无法正常工作.
我有一个存储库,它有几个实现来提供不同的功能,存储库只与内联的所有不同实现一起使用,以下是代码的基础知识:
温莎城堡注册:
RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepositoryAuthorizationDecorator))),
RepositoryRegistration<AccountRepositoryAuthorizationDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepositoryMaskingDecorator))),
RepositoryRegistration<AccountRepositoryMaskingDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepository))),
RepositoryRegistration<AccountRepository>());
Run Code Online (Sandbox Code Playgroud)
RepositoryRegistration方法:
private static ComponentRegistration<TRepository> RepositoryRegistration<TRepository, TConcreteRepository>()
where TConcreteRepository : TRepository where TRepository : class
{
return Component
.For<TRepository>()
.ImplementedBy<TConcreteRepository>()
.Named(typeof(TConcreteRepository).Name);
}
Run Code Online (Sandbox Code Playgroud)
基础接口:
public interface IAccountRepository
{
string Create(Account account);
void Update(Account account);
Account Get(string accountId);
}
Run Code Online (Sandbox Code Playgroud)
实施:
public class AccountRepositoryFeedEntryDecorator : IAccountRepository
{
private readonly IAccountRepository decoratedRepository;
public AccountRepositoryFeedEntryDecorator(
IAccountRepository decoratedRepository)
{
this.decoratedRepository = decoratedRepository;
}
string Create(Account account)
{
//Add Entry To Feed
return …
Run Code Online (Sandbox Code Playgroud) 澄清的问题(tl; dr)
在阅读和分析下面介绍的所有结果之后,问题似乎归结为GC在服务器模式下不为我们的应用程序收集Gen 0堆,一旦它更改为工作站模式,问题就会消失.
原始问题和细节
我们最近在我们的测试环境中遇到了.NET应用程序中的内存泄漏问题,工作进程在负载下或在无负载时会迅速升至450MB左右.
这个问题无法在我们的开发环境中复制,主要区别在于开发环境是物理服务器,而测试环境是由Puppet虚拟化和控制的(除此之外我对环境本身并不了解).
为了有希望看到哪些对象负责占用所有内存,我在测试服务器上运行了Ants Memory Profiler,我发现所有内存都保持未使用状态并且从未被释放.
在研究可能导致这种情况的原因时,我发现了这个论坛帖子,这反过来引导我阅读这篇文章.
我最后尝试了它建议的配置,将GC置于工作站模式:
<configuration>
<runtime>
<gcServer enabled="false"/>
<gcConcurrent enabled="false"/>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
在运行iisreset并重新运行我的内存分析后,问题完全消失了,这很好,但仍然没有真正解释首先发生的事情.
我确实做了一些阅读并发现了这个问题,这使我相信这种配置改变可能最终会对我们的应用程序的吞吐量产生不利影响.
所以我的问题是:什么会导致IIS工作进程累积大量未被垃圾收集的未使用内存?
编辑: 为了更清楚地澄清我的问题,我相信我们已经证明代码不对此负责,因为完全相同的代码在开发环境中不会遇到此问题.
以下是我在配置更改之前和之后对内存分析所拍摄的屏幕截图,这里没有很多信息,但图表确实很好地显示了内存趋势.
编辑2: 这是我可以收集的服务器规格,我可能会得到更多只需要时间.
开发环境:物理机CPU:单核内存:6GB
测试环境:虚拟机CPU:4个逻辑线程(我无法评论CPU数量)内存:8GB
Machine.Config文件的唯一区别是开发环境正在为端点和服务行为添加"Microsoft.VisualStudio.Diagnostics.ServiceModelSink.Behavior".
并且测试环境当前具有aspnet.config文件中先前提到的GC设置.
编辑3: 做了一些更多的分析并注意到我可以在Ants中添加更多的计数器,特别是我添加了"Gen 0堆大小",看起来这是问题的根源.当GC处于服务器模式时,当我触发测试时,我正在用于分析此行,立即跳转到~300MB,然后回到~230MB,但永远不会一直回落(下图).
在工作站模式下使用GC运行相同的分析会看到Gen 0堆大小具有小得多的初始峰值,并在请求完成时返回到基本为零(下图).
进行一些更多的搜索引导我到另一个更相关的SO问题,但是他的发现是这个内存使用是一个非问题,而在我的情况下,服务实际上需要每天至少手动重启一次.
我还发现这篇文章在这个问题上有以下说法(这似乎描述了几乎完美的情况:
第0代可能在64位系统上拥有更多的对象,尤其是当您使用服务器垃圾收集而不是工作站垃圾收集时.这是因为在这些环境中触发第0代垃圾收集的阈值更高,并且第0代集合可以变得更大.当应用程序在触发垃圾收集之前分配更多内存时,性能会得到改善.
虽然问题仍然存在,在服务器模式下,第0代堆似乎从未被收集,而不是经常收集.
随着昨天发布的Visual Studio 2015,我的开发团队对升级和使用新的C#6.0功能非常感兴趣,因为我们都拥有MSDN,这肯定是可能的.
但是我担心我们的Teamcity构建将失败,而不会执行一些升级构建代理的工作.
那么有没有人经历过这个过程,或者知道需要什么?
编辑:我对Teamcity做了一些研究,并注意到在版本9.0和9.1 的What's New页面上它增加了对VS 2015的支持,那么它是否涵盖了所需的内容?而且,既然我们正在运行TeamCity 8.0,那么有没有办法在不升级的情况下添加Roslyn支持?
我试图将我的主仓库中的所有提交压缩到我的分支内的一个提交.我这样做是因为主分支是从我们无法控制的远程仓库中提取的,而有问题的分支被拉/推到我们自己的远程git仓库(Atlassian Stash).我这样做是因为我真的不想要或不关心主分支的所有提交历史.
我开始使用整个过程git rebase --root -i
,在交互式部分中我选择重新编写第一个提交并修复其余部分(大约有16000个提交)
现在在进程的中间,rebase经常遇到冲突,如果甚至一半的提交导致冲突,手动选择接受他们的冲突将花费很长时间.
因此,当由于冲突而停止rebase过程时,是否可以将合并策略更改为始终接受它们?
c# ×6
angularjs ×1
automapper ×1
automapper-4 ×1
c#-6.0 ×1
castle ×1
git ×1
git-merge ×1
iis-7 ×1
inheritance ×1
ng-animate ×1
roslyn ×1
teamcity ×1
wpf ×1
xaml ×1