小编Geo*_*dze的帖子

何时处置CancellationTokenSource?

这个班级CancellationTokenSource是一次性的.快速浏览Reflector证明KernelEvent了(很可能)非托管资源的使用.由于CancellationTokenSource没有终结器,如果我们不处理它,GC将不会这样做.

另一方面,如果您查看MSDN文章" 托管线程中的取消"中列出的示例,则只有一个代码段处置该令牌.

在代码中处理它的正确方法是什么?

  1. using如果您不等待它,则无法将启动并行任务的代码包装起来.只有在你不等的时候取消才有意义.
  2. 当然你可以ContinueWith通过Dispose电话添加任务,但这是要走的路吗?
  3. 那些可以取消同步的可取消的PLINQ查询呢,但最后只做一些事情?我们说吧.ForAll(x => Console.Write(x))
  4. 它可以重复使用吗?是否可以将相同的令牌用于多个调用,然后将其与主机组件一起处理,让我们说UI控件?

因为它没有类似于Reset清理IsCancelRequestedToken字段的方法,所以我认为它不可重复使用,因此每次启动任务(或PLINQ查询)时都应该创建一个新任务.这是真的吗?如果是,我的问题是Dispose在这些CancellationTokenSource案例中处理的正确和建议的策略是什么?

c# parallel-extensions plinq task-parallel-library c#-4.0

142
推荐指数
7
解决办法
4万
查看次数

嵌套使用语句和Microsoft代码分析

最近我开启了额外的代码分析规则.令我惊讶的是,我在一个我一直在考虑作为最佳实践的地方看到了违规行为.如果我有两个嵌套的一次性用品,我会使用两个这样的语句:

    using (StringReader strReader = new StringReader(xmlString))
    using (XmlReader xmlReader = XmlReader.Create(strReader))
    {
        result.ReadXml(xmlReader);
    }
Run Code Online (Sandbox Code Playgroud)

这也对应于C#中高评级的Q&A 嵌套使用语句

我得到的违规声明如下:

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)

.net c# code-analysis fxcop

25
推荐指数
1
解决办法
4559
查看次数

在.NET中查找用于并发的静态代码分析工具,如CheckThread for java

我采取的C#.NET并行数据结构(如ConcurrentDictionary,BlockcingCollection等).这不仅仅是在从不同线程访问时忘记锁定对象.它需要复杂的锁定策略来最大化并行执行时间.

我知道有一个工具,一种用于.NET的系统并发测试的框架,名为CHESS.

问题:是否还有一种工具可以通过静态代码分析找到并发/线程问题?类似CheckThread的东西,适用于java.

.net c# multithreading task-parallel-library

10
推荐指数
1
解决办法
2719
查看次数

在.NET中是否有公开可用的素数表

我知道在所有类型的.NET字典和哈希表中都有一个用于:

internal static class HashHelpers

  • 还有一个公共场所吗?
  • 如果不是,为什么它保持内部不是非常常用的东西?
  • 如果我的代码中需要素数,那么复制和粘贴是否可行?

.net c# vb.net primes

7
推荐指数
1
解决办法
359
查看次数

具有O(1)查找时间的数据结构,这将允许重复

我的目标是创建一个实现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>以便:

  1. 查找操作有O(1)时间.
  2. 所有其他操作具有相同的O()性能List<T>
  3. 内存可能受哈希表开销(constantA + constantB * n字节)的影响.
  4. 必须允许重复
  5. 允许空值是可选的(它们可以装入空对象)

.net c# collections performance data-structures

7
推荐指数
1
解决办法
1360
查看次数

如果在Ajax表单中使用,jQuery不显眼的验证会忽略提交按钮上的"取消"类

我正在尝试使用可选的客户端验证

  • ASP.NET MVC 4,
  • 不引人注目的jQuery验证,
  • 不引人注目的ajax

这很好用

下面的图片显示了我对可选的客户端验证的意思:我的表单上唯一一个字段应该包含电子邮件,因此附加了一个电子邮件验证器.

在此输入图像描述

现在我们点击保存.由于我们的文本"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

6
推荐指数
2
解决办法
7734
查看次数

在F#中从地图中删除所有

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与上面的效率一样高效.

问题:

  1. RemoveAllF#中效率最高的是什么?
  2. 你认为F#递归优化是否会编译成同样有效的东西?

.net c# f# immutable-collections

6
推荐指数
1
解决办法
125
查看次数