这个班级CancellationTokenSource是一次性的.快速浏览Reflector证明KernelEvent了(很可能)非托管资源的使用.由于CancellationTokenSource没有终结器,如果我们不处理它,GC将不会这样做.
另一方面,如果您查看MSDN文章" 托管线程中的取消"中列出的示例,则只有一个代码段处置该令牌.
在代码中处理它的正确方法是什么?
using如果您不等待它,则无法将启动并行任务的代码包装起来.只有在你不等的时候取消才有意义.ContinueWith通过Dispose电话添加任务,但这是要走的路吗?.ForAll(x => Console.Write(x))?因为它没有类似于Reset清理IsCancelRequested和Token字段的方法,所以我认为它不可重复使用,因此每次启动任务(或PLINQ查询)时都应该创建一个新任务.这是真的吗?如果是,我的问题是Dispose在这些CancellationTokenSource案例中处理的正确和建议的策略是什么?
最近我开启了额外的代码分析规则.令我惊讶的是,我在一个我一直在考虑作为最佳实践的地方看到了违规行为.如果我有两个嵌套的一次性用品,我会使用两个这样的语句:
using (StringReader strReader = new StringReader(xmlString))
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
result.ReadXml(xmlReader);
}
Run Code Online (Sandbox Code Playgroud)
我得到的违规声明如下:
Warning 18 CA2202 : Microsoft.Usage : Object 'strReader' can be disposed more
than once in method '????'. To avoid generating a System.ObjectDisposedException
you should not call Dispose more than one time on an object.: Lines: ??
Run Code Online (Sandbox Code Playgroud)
我所做的是一个直观的尝试和错误,认为外部流的关闭也可能会处理内部的我快速修复我的代码,如下所示:
using (XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString)))
{
result.ReadXml(xmlReader);
}
Run Code Online (Sandbox Code Playgroud)
胡拉!警告消失了.但是,田田!新的一个发生:
Warning 18 CA2000 : Microsoft.Reliability : In method '????????', object
'new StringReader(xmlString)' is …Run Code Online (Sandbox Code Playgroud) 我采取的C#.NET并行数据结构(如ConcurrentDictionary,BlockcingCollection等).这不仅仅是在从不同线程访问时忘记锁定对象.它需要复杂的锁定策略来最大化并行执行时间.
我知道有一个工具,一种用于.NET的系统并发测试的框架,名为CHESS.
问题:是否还有一种工具可以通过静态代码分析找到并发/线程问题?类似CheckThread的东西,适用于java.
我知道在所有类型的.NET字典和哈希表中都有一个用于:
internal static class HashHelpers
我的目标是创建一个实现IList<T>接口的数据结构,O(1)通过破坏内存来实现元素查找时间.
背景
如您所知,所有基于数组的IList<T>实现List<T>都具有O(n)元素查找时间.这意味着操作喜欢int IndexOf(T element)或bool Contains(T element)遍历底层数组直到找到匹配.
众所周知的想法是使用列表和散列表的组合作为底层数据结构.值保存在列表中.哈希表将索引作为键的值和值保存.因此可以使用哈希表执行查找.
这就是KeyedCollection<TKey, TItem> 看MSDN的实现方式.
到目前为止我尝试过的
internal class MyList<T> : KeyedCollection<T, T>
{
protected override T GetKeyForItem(T item)
{
return item;
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,除了一个问 此数据结构不能完全模仿预期的行为List<T>.关键是List<T>允许重复,MyList不是.
题
是否有任何现成的数据结构,或者您可以推荐一种优雅的实现方式,IList<T>以便:
O(1)时间.O()性能List<T>constantA + constantB * n字节)的影响.我正在尝试使用可选的客户端验证
下面的图片显示了我对可选的客户端验证的意思:我的表单上唯一一个字段应该包含电子邮件,因此附加了一个电子邮件验证器.

现在我们点击保存.由于我们的文本"name @ doamin"不是有效的电子邮件,因此会显示验证摘要.与验证摘要一起,我们取消隐藏"无论如何"保存按钮.
第二个按钮是一个正常的提交按钮class="cancel".这指示jQuery.validate.js脚本在使用此按钮提交时跳过验证.
以下是视图的代码段:
@using (Html.BeginForm())
{
<div>
<input data-val="true" data-val-email="Uups!" name="emailfield" />
<span class="field-validation-valid" data-valmsg-for="emailfield" data-valmsg-replace="false">*</span>
</div>
<input type="submit" value="Save" />
@Html.ValidationSummary(false, "Still errors:")
<div class="validation-summary-valid" data-valmsg-summary="true">
<input type="submit" value="Save anyway" class="cancel" />
</div>
}
Run Code Online (Sandbox Code Playgroud)
一切正常.
如果我切换到Ajax表单,第二个提交按钮 - "仍然保存"按预期停止工作.它的行为与正常行为相同,并且在验证成功之前阻止提交.
以下是"ajaxified"视图的代码段:
@using (Ajax.BeginForm("Edit", new { id = "0" },
new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "ajaxSection", …Run Code Online (Sandbox Code Playgroud) jquery jquery-validate unobtrusive-validation asp.net-mvc-4 unobtrusive-ajax
C#:
在C#我有这样的事情:
IImmutableDictionary<string, string> map = new Dictionary<string, string>
{
{"K1", "V1"},
{"K2", "V2"},
{"K3", "V3"},
}.ToImmutableDictionary();
IEnumerable<string> keys = new[] {"K1,K3"};
map = map.RemoveRange(keys);
Run Code Online (Sandbox Code Playgroud)
我假设ImmutableDictionary<K,V>.RemoveRange Method (IEnumerable<K>)引入了该方法,因为它比一系列Remove(K)调用更有效.它仅为每个keys要删除的元素创建一次生成的不可变对象,而不是一次.
F#:
什么是实现同样的最好方法F# .我想出了这个递归解决方案:
let rec removeAll (map:Map<string, string>, keys:list<string>) =
match keys with
| [] -> map
| _ -> removeAll(map.Remove(keys |> Seq.head), keys.Tail)
Run Code Online (Sandbox Code Playgroud)
但我怀疑它RemoveRange与上面的效率一样高效.
问题:
RemoveAllF#中效率最高的是什么?