小编Fra*_*mer的帖子

C#是否存储大于512长(4096字节)的数组?

我使用.NET Framework中实现的集合类型做了一些基准测试.

从参考源我知道List<T>使用数组来存储内容.为避免每次插入时调整数组大小,每次可用空间用完时,数组长度都会加倍.

大小 -  <code>long</code>值插入到a中<code>List</code>(参见上图中的大小 - 时间 - 图表).列表大小(如128或256)中存在明显的

根据我的理解,除了需要重新分配内部数组的情况外,图表应该是严格不变的.这种行为是否有任何原因,可能与CLR或Windows内存管理/内存碎片有关?

基准测试在Windows 10/i7-3630QM机器上以64位应用程序执行(源代码如下所示).由于单个添加操作无法测量,因此我创建了1000个列表,并为每个列表大小添加了一个项目.

for (int i = 1; i <= MaxCollectionSize; i++)
{
    // Reset time measurement
    TestContainer.ResetSnapshot();

    // Enable time measurement
    TestContainer.BeginSnapshot();
    // Execute one add operation on 1000 lists each
    ProfileAction.Invoke(TestContainer);
    TestContainer.EndSnapShot();

    double elapsedMilliseconds = (TestContainer.GetElapsedMilliSeconds() / (double)Stopwatch.Frequency) * 1000;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:我仔细检查了我的结果,是的,它们是可重复的.我将测试的集合数量从1000增加到10000,结果现在更加平滑(见下图).现在可以清楚地看到调整内部阵列大小的尖峰.然而在图中的步骤仍然存在-这是与预期的O(1)复杂性的阵列插入应该是,如果你忽略调整大小存在分歧.

我还尝试在每次Add操作之前触发GC集合,图表保持完全相同.

关于创建委托对象的问题:我的所有委托(例如ProfileAction)都是在一个完整的测试周期中保持分配的实例属性,在这种情况下是10000个列表,每个列表有1000个添加操作.

在此输入图像描述

.net c# arrays performance .net-4.6

15
推荐指数
2
解决办法
628
查看次数

C#从内存中安全删除变量

我正在制作与安全相关的计划,我想确保我以正确的方式这样做.当有人使用密码登录时,密钥会被解密并存储在变量中.当他们注销时,我希望内存中的数据被完全删除,而不仅仅是标记为已删除.我目前正在做以下事情:

public void Logout()
{
    RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
    for (var i = 0; i < 3; i++)
    {
        byte[] data = new byte[(int) Math.Round((double) (_phraseHash.Count()))];
        rngCsp.GetBytes(data);
        int randomNum = BitConverter.ToInt32(data, 0);
        _phraseHash = randomNum.ToString();
    }
    LoggedIn = false;
    _phraseHash = null;
}
Run Code Online (Sandbox Code Playgroud)

我想知道的是,这是否足以从系统中完全删除密钥(_phraseHash).

这甚至是必要的吗?我实际上并不知道内存中的数据是如何被删除的,我只是假设它有点类似于硬盘驱动器如何工作,其中字节被标记为删除并在其他需要空间时重写.

c# memory security

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

Zookeeper:主机名解析失败

我在 OpenShift/Kubernetes 环境中运行 Zookeeper。我已将 zookeeper 设置为 a StatefulSet,以便可靠地保留配置数据。

我在我zoo.cfg的主机名中配置了三个服务器,但是在启动时,主机名解析失败。我验证了主机名确实可以在我的集群中使用 nslookup 解析。

动物园.cfg:

clientPort=2181
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/log
tickTime=2000
initLimit=10
syncLimit=2000
maxClientCnxns=60
minSessionTimeout= 4000
maxSessionTimeout= 40000
autopurge.snapRetainCount=3
autopurge.purgeInteval=0
server.1=zookeeper-0.zookeeper-headless:2888:3888
server.2=zookeeper-1.zookeeper-headless:2888:3888
server.3=zookeeper-2.zookeeper-headless:2888:3888
Run Code Online (Sandbox Code Playgroud)

我的 OpenShift / Kubernetes 配置的相关部分:

  # StatefulSet
  - apiVersion: apps/v1beta1
    kind: StatefulSet
    metadata:
      labels:
        app: zookeeper
      name: zookeeper
    spec:
      serviceName: zookeeper-headless
      replicas: 3
      template:
        metadata:
          labels:
            app: zookeeper
        spec:
          containers:
            - image: 172.30.158.156:5000/os-cloud-platform/zookeeper:latest
              name: zookeeper
              ports:
                - containerPort: 2181
                  protocol: TCP
                  name: client
                - containerPort: 2888
                  protocol: TCP
                  name: …
Run Code Online (Sandbox Code Playgroud)

openshift kubernetes apache-zookeeper kube-dns

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

C#WinForm中MessageBox的连续弹出

这是我的代码:

private void btnReminder_Click(object sender, EventArgs e)
{
    timer2.Start();
}

private void timer2_Tick(object sender, EventArgs e)
{
    DateTime Date = DateTimePickerReminderDate.Value;
    DateTime Time = DateTimePickerReminderTime.Value;
    if (DateTime.Now.CompareTo(Date) > 0 && DateTime.Now.CompareTo(Time) > 0) 
    {
        Date = DateTime.MaxValue;
        Time = DateTime.MaxValue; 
        MessageBox.Show("Your Reminder");

        timer2.Stop();     
    }
}   
Run Code Online (Sandbox Code Playgroud)

当我设置提醒它按预期工作并在正确的时间显示消息.但问题是,它不断弹出消息框我试图清除这个错误但我没有成功.所以我现在需要专家建议所以请帮我清除这个bug.

c# messagebox winforms

4
推荐指数
1
解决办法
280
查看次数

Spark:在集群模式下部署到 OpenShift 时发生 StreamCorruptedException

我正在尝试向我的 Spark master 提交 Spark 应用程序。主站和多个从站正在 OpenShift 环境中运行。Spark master 的 Web UI 显示了连接的工作线程。

应用程序 jar 部署到/jars每个 Spark pod 中。

这是我的提交脚本:

spark-submit2.cmd --conf "spark.driver.extraClassPath=/jars" 
                  --conf "spark.executor.extraClassPath=/jars" 
                  --conf "spark.submit.deployMode=cluster" 
                  --master spark://******:31824 
                  --class Main 'local:/jars/SparkHelloWorld-1.0-SNAPSHOT.jar'
Run Code Online (Sandbox Code Playgroud)

应用程序本身很简单:

public class Main {

    private static String MASTER = "spark://******:31824";

    public static void main(String[] args) throws Exception {

        //Create a SparkContext to initialize
        SparkConf conf = new SparkConf()
                .setMaster(MASTER)
                .setAppName("SparkPi");

        // Create a Java version of the Spark Context
        JavaSparkContext sc = new JavaSparkContext(conf);

        final …
Run Code Online (Sandbox Code Playgroud)

java openshift apache-spark

4
推荐指数
2
解决办法
2331
查看次数

WPF工具包:CheckComboBox和[Flags]枚举

我正在使用Xceed Extended WPF Toolkit来显示带有[Flags]属性的枚举PropertyGrid.

[Flags]             
public enum TestEnum
{
    Test1 = 1,
    Test2 = 2,
    Test3 = 4,
    Test4 = 8,
    Test5 = 16,
    Test6 = 32,
    Test7 = 64,
}
Run Code Online (Sandbox Code Playgroud)

因为我无法在编译时知道枚举定义,所以我将使用EnumBuilder动态创建枚举.

我创建了一个编辑器来显示枚举CheckComboBox:

public class CheckComboBoxEditor : TypeEditor<CheckComboBox>, ITypeEditor
{
    protected override void SetValueDependencyProperty()
    {
        ValueProperty = CheckComboBox.SelectedValueProperty;
    }

    protected override CheckComboBox CreateEditor()
    {
        return new CheckComboBox();
    }

    protected override void ResolveValueBinding(PropertyItem propertyItem)
    {
        var _binding = new Binding("Value");
        _binding.Source = propertyItem; …
Run Code Online (Sandbox Code Playgroud)

c# wpf enums wpftoolkit xceed

2
推荐指数
1
解决办法
992
查看次数

带有int值的公共枚举

我已经定义了一个公共枚举,如下所示:

public enum guests
{
    One,
    Two
}
Run Code Online (Sandbox Code Playgroud)

我想要做的就是让它像下面这样

public enum guests
{
    1,
    2
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这个时,我一直收到这个错误:

Identifier expected
Run Code Online (Sandbox Code Playgroud)

我可以设置int而不是字符串吗?

c# enums

2
推荐指数
1
解决办法
388
查看次数