问题
我昨天刚刚进行了一些性能记录,因为我注意到很久以前看过任务管理器的句柄泄漏,虽然修复它的优先级不高.这是隔夜运行,每隔10秒进行一次采样.
我还没有把它运行到失败,由于时间的限制,我的测试计算机也是我的开发计算机所以在编写代码时运行它并不理想...所以我不确定是否/何时会崩溃,但我高度怀疑这只是时间问题.
注意:区域中的红色框是我"停止"工作循环并在短暂停顿后重新启动它的地方.线程在"停止"时从~100下降到~20.在从约62,000到约40,000之间约30秒后重新启动循环之前,手柄没有下降.所以一些句柄正在进行GC,只是没有我想象的那么多.我无法弄清楚root是阻止所有这些句柄被收集还是它们最初来自哪里(即任务,GUI,文件等).
如果您已经知道可能导致此问题的原因,则无需再进一步阅读.我已经提供了剩下的这些信息和代码,以便用枪支方式解决问题.我会删除,编辑等因为根本原因缩小了.出于同样的原因,如果感兴趣的东西丢失了,请告诉我,我将尝试提供它(日志,转储等).
我做了什么
就我自己而言,我已经完成了关于跟踪处理滥用的教程,并且在查看转储文件时找到了Handles打开和关闭的位置...但是它只是压倒了成千上万的句柄才能让人感觉到而且我无法加载Symbols,所以指针对我来说只是胡言乱语.
我还没有在我的列表中查看以下两个,但是想知道是否有一些更友好的方法...
我还将我怀疑可能导致此问题的代码拆分成另一个小应用程序,并且所有内容似乎都没有问题地收集垃圾(虽然执行模式与真实应用程序相比大大简化).
潜在的罪魁祸首
我确实有几个长期存在的实例类,只要应用程序打开就会持续,包括每个只创建一次的5个表单,然后根据需要隐藏/显示.我使用主对象作为我的应用程序控制器,然后通过事件将模型和视图连接到Presenter-Presenter-First模式.
以下是我在此应用程序中执行的一些操作,可能重要也可能不重要:
Action,Func和lambda表达式广泛,其中一些可能是长寿命Task为异步执行生成s.Controls.Task和Parallel.For/ Parallel.Foreach或运行工人方法(或上面提到的事件)主循环
这个应用程序时,它的一般流程运行是基于遍历的一系列文件的离线版本,并在数字输入信号的轮询在线版本.下面是带有离线版本注释的sudo-code,这是我可以从我的笔记本电脑上运行而无需外部硬件以及上面的图表正在监控的内容(我目前无法访问在线模式的硬件)).
public void foo()
{
// Sudo Code
var InfiniteReplay = true;
var Stopped = new CancellationToken();
var FileList = new List<string>();
var AutoMode = new ManualResetEvent(false);
var CompleteSignal = new ManualResetEvent(false);
Action<CancellationToken> …Run Code Online (Sandbox Code Playgroud) 注意:根据评论交叉发布到ServerFault.
我需要密码保护我的应用程序中的某些操作,例如加载/保存文件,单击复选框等.这是一个标准的C#.Net 4.0,WinForms应用程序,它将在企业网络中的Windows 7上运行.
我正准备推出我自己的非常基本的系统(用宽敞的后门阅读混淆)和一个用户/密码/权限(哈希和盐渍)的文本文件,直到经过一些搜索我发现看起来像一个 诱人的简单方法,但我'我很难找到关于不与ASP.NET 有关的角色的好教程.
所以有人知道一个或多个教程,告诉我如何:
Role或权限.
Interface只是询问Windows,如果当前用户有权限ABC和不太关心Windows如何解决这个问题.然后,我可以为每个Local/Network/ActiveDirectory /等进行具体实现.根据需要使用用例(或者如果需要的话......因为我现在甚至都不知道).- read if interested, but not required to answer question
Run Code Online (Sandbox Code Playgroud)
为了确保我在这里朝着正确的方向前进,基本上我需要/想要在我的开发PC上测试它,以确保它能为我的客户提供良好的最终用户体验.问题是,目前他们为运行我的应用程序的每台计算机运行自动登录脚本,并且有几个不同的运算符在一天中使用我的应用程序.客户希望我的应用程序的某些功能受到密码保护,并且只向某些运营商提供.我没有问题,因为我已经预料到请求一段时间了,我以前从未编程过身份验证.
我认为说服我的客户为每个运营商提供他们自己的网络帐户并为他们分配他们想要的任何权限是值得的,以防他们需要解雇某人,更改权限等.这也意味着我只需打开几个选项他们可以根据内部公司政策对这些权限进行分组,但我真的不应该担心这些权限(但如果我必须自己动手,因为他们的IT部门几乎一无所知)我的应用程序).
从我所知道的,它还可以通过不必处理散列密码和加密等使我的生活变得更加轻松,并且只需处理单击此按钮或该按钮所需的角色.
我正在尝试从文本文件中运行'Recipe'读取并逐行解析以动态调用一系列方法.我想在做了一些谷歌搜索后我需要实现一个工厂,但我缺少一些关键细节.这是我最接近的例子:
http://simpleprogrammer.com/2010/08/17/pulling-out-the-switch-its-time-for-a-whooping/
以下代码是现在的代码片段.
internal static void Run(int Thread_ID, List<StringBuilder> InstructionSet, List<double>[] Waveforms)
{
//Init
List<double>[] Register = new List<double>[10];
for (int i = 0; i < Waveforms.Length; i++) { Register[i] = new List<double>(Waveforms[i]); }
for (int i = 0; i < Register.Length; i++) { if (Register[i] == null) { Register[i] = new List<double>(); } }
//Run Recipe Steps
foreach (var item in InstructionSet)
{
Step Op = Step.Parse(item.ToString());
switch (Op.TaskName)
{
case "SimpleMovingAverage":
Register[Convert.ToInt32(Op.Args[0])] = Signal_Filters.SimpleMovingAverage(Register[Convert.ToInt32(Op.Args[1])], Convert.ToInt32(Op.Args[2]));
break;
case "RollingSteppedStdDeviation": …Run Code Online (Sandbox Code Playgroud) 如果我下载FluentAssertions 1.7.1(我目前所有的单元测试都是针对的),那么我可以对dll进行引用,下面的测试也可以正常工作.
但我试图通过NuGet升级并使用FluentAssertions版本3.0.90并尝试3.0.107.在遇到问题之后我试图制作一个全新的解决方案/类库项目,但它无法从库中检测出任何东西......
下面的测试将无法编译,因为.Should无法找到bool...或其他任何相关的扩展方法.但我可以清楚地看到它存在于对象浏览器中我可以在我的程序集引用中看到FluentAssertions和FluentAssertions.Core,但只能在对象浏览器中查看FluentAssertions.Core.Intellisence似乎唯一能找到的扩展方法是.ShouldRaisePropertyChangeFor<...>和.ShouldNotRaisePropertyChangeFor<...>.
我的项目目标是.Net4.0,此时我认为这是一个配置问题,但我不知道从哪里开始查看是否存在.谷歌上没有其他人似乎有这个问题.
using System;
using FluentAssertions;
using NUnit.Framework;
namespace IntegrationTests.CommonTests
{
[TestFixture]
public class _BasicTemplate_Tests
{
[Test]
public void Run_Basic_Test()
{
true.Should().Be(true);
}
}
}
Run Code Online (Sandbox Code Playgroud) 所以这就是我的清单.
[0], [1], [2], [3], [4]
Run Code Online (Sandbox Code Playgroud)
我希望能够遍历这些 - 但这里的诀窍是我想从一个偏移开始然后循环回到那个偏移量?
恩.
[0], [1], [2], [3], [4]
o-->
//Start at offset 1 then get 2, 3, 4 then loop back around to zero
Run Code Online (Sandbox Code Playgroud)
EX2.
[0], [1], [2], [3], [4]
o-->
//Start at offset 3 then get 4, then loop back around to zero, then 1, 2
Run Code Online (Sandbox Code Playgroud)
我考虑使用常规List<T>并尝试将此概念实现为for循环但我不确定我是否想要这样做,如果他们这样做更简洁的方式.
基本上不要从0开始并循环回到开始并通过元素返回到偏移量.
c# ×4
c#-4.0 ×2
winforms ×2
.net-4.0 ×1
dictionary ×1
factory ×1
list ×1
memory-leaks ×1
refactoring ×1