小编tho*_*mai的帖子

理解给定的计算(cast + multiplication)

(int)((float)10.9 * 10)
Run Code Online (Sandbox Code Playgroud)

被评估为108.为什么?

IMO (int)-cast应在乘法进行评估.

.net c# casting

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

按索引获取PerformanceCounter

我想访问在具有不同本地化的系统上运行的应用程序中的"处理器时间%"计数器.

为此,我想通过其索引访问计数器,该索引保证是唯一的(请参阅https://support.microsoft.com/en-us/kb/287159).

下面的代码工作并为我提供了当前语言环境的正确结果,但是要打开性能计数器,我还需要计数器的类别名称(请参阅PerformanceCounter类的构造函数)以及实例名称:

[DllImport("pdh.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern UInt32 PdhLookupPerfNameByIndex(string szMachineName, uint dwNameIndex, StringBuilder szNameBuffer, ref uint pcchNameBufferSize); 

void Main()
{
    var buffer = new StringBuilder(1024);
    var bufSize = (uint)buffer.Capacity;
    PdhLookupPerfNameByIndex(null, 6, buffer, ref bufSize);
    Console.WriteLine(buffer.ToString());

    var counter = new PerformanceCounter(/* category??? */, buffer.ToString(), /* instance??? */);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得该类别和实例名称?

另请参阅: 以与语言无关的方式检索性能计数器值,该方法描述了相同的问题,但未提供解决方案.

c# winapi perfmon

8
推荐指数
1
解决办法
1232
查看次数

Task.WaitAll没有等待 - 解释

以下代码(LINQPadSample)应该创建5个工作任务,并等待所有任务完成.

相反,它启动5个任务并立即输出"... Done"- 消息.

问题是(Action)- 演员之后Task.Run.如果我删除该演员表,一切都按预期工作.

这里发生了什么?这对我没有任何意义,因为在我看来演员是多余的.

void Main()
{
    var tasks = Enumerable.Range(1, 5).Select(x => this.DoWork()).ToArray();

    Console.WriteLine("Waiting ... ");
    Task.WaitAll(tasks);
    Console.WriteLine("... Done");
}

Task DoWork()
{
    return Task.Run(
        (Action)(async () =>
        {
            Console.WriteLine("Task start");
            await Task.Delay(3000);
            Console.WriteLine("Task end");
        }));
}
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous

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

使用timeBeginPeriod /任务调度时Thread.Sleep与Task.Delay

给出附加的LINQ-Pad片段.

它创建8个任务,执行500毫秒并绘制线程实际运行时的图表.

在4核CPU上,它可能如下所示: 在此输入图像描述

现在,如果我在线程循环中添加Thread.Sleep Task.Delay,我可以看到windows系统计时器的时钟(~15ms):

在此输入图像描述

现在,还有一个timeBeginPeriod功能,我可以降低系统计时器的分辨率(在例子中为1ms).这就是区别.随着Thread.Sleep我得到这个图表(我的预期):

在此输入图像描述

使用时,Task.Delay我获得与时间设置为15ms时相同的图形:

在此输入图像描述

问题:为什么TPL忽略了定时器设置?

这是代码(你需要LinqPad 5.28 beta运行图表)

void Main()
{
    const int Threads = 8;
    const int MaxTask = 20;
    const int RuntimeMillis = 500;
    const int Granularity = 10;

    ThreadPool.SetMinThreads(MaxTask, MaxTask);
    ThreadPool.SetMaxThreads(MaxTask, MaxTask);

    var series = new bool[Threads][];
    series.Initialize(i => new bool[RuntimeMillis * Granularity]);

    Watch.Start();
    var tasks = Async.Tasks(Threads, i => ThreadFunc(series[i], pool));
    tasks.Wait();

    series.ForAll((x, y) => series[y][x] ? new { X = x / (double)Granularity, Y …
Run Code Online (Sandbox Code Playgroud)

c# multithreading task-parallel-library

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

用于selectmany + join + let的LINQ查询语法

我想比较一个命名数据字典列表与从数据提供者读取的实际数据.结果应该是以下形式的平面列表:[表]:[Key]从[OldValue]更改为[NewValue].

我想使用linq的查询语法,不需要性能.具有相同名称的词典总是具有相同的键,不需要检查.

我提出了以下查询(您可以在LINQ-Pad中使用它)但我在第一次连接中无法访问table2.错误:"名称'table2'在当前上下文中不可用"(第8行).

有任何想法吗?

void Main()
{
    var db1 = new[] { new Table { Name = "TableA", Data = new Dictionary<string, string> { { "KeyA", "000" } } } };

    var changes = from table1 in db1
                let table2 = ReadTable(table1.Name)
                from row1 in table1.Data
                join row2 in table2.Data
                    on row1.Key equals row2.Key
                where !row1.Value.Equals(row2.Value)
                select new { Table = table1.Name, Key = row1.Key, From = row1.Value, To = row2.Value };

    changes.Dump(); 
}

Table ReadTable(string …
Run Code Online (Sandbox Code Playgroud)

c# linq

3
推荐指数
1
解决办法
338
查看次数