(int)((float)10.9 * 10)
Run Code Online (Sandbox Code Playgroud)
被评估为108.为什么?
IMO (int)-cast应在乘法后进行评估.
我想访问在具有不同本地化的系统上运行的应用程序中的"处理器时间%"计数器.
为此,我想通过其索引访问计数器,该索引保证是唯一的(请参阅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)
我怎样才能获得该类别和实例名称?
另请参阅: 以与语言无关的方式检索性能计数器值,该方法描述了相同的问题,但未提供解决方案.
以下代码(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) 给出附加的LINQ-Pad片段.
它创建8个任务,执行500毫秒并绘制线程实际运行时的图表.
现在,如果我在线程循环中添加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) 我想比较一个命名数据字典列表与从数据提供者读取的实际数据.结果应该是以下形式的平面列表:[表]:[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)