GVKun编程网logo

c# – GetSystemMetrics()为.NET 4.5和.NET 4.0返回不同的结果(c# getresponse)

18

对于想了解c#–GetSystemMetrics()为.NET4.5和.NET4.0返回不同的结果的读者,本文将提供新的信息,我们将详细介绍c#getresponse,并且为您提供关于.NET6全新指

对于想了解c# – GetSystemMetrics()为.NET 4.5和.NET 4.0返回不同的结果的读者,本文将提供新的信息,我们将详细介绍c# getresponse,并且为您提供关于.NET 6 全新指标 System.Diagnostics.Metrics 介绍、Amazon Textract 返回不同的结果在 WebApp Demo、AnalyzeDocumentRequest 和 StartDocumentAnalysisRequest 之间返回不同的结果、android-TelephonyManager.getDeviceId(0)返回不同的结果、asp.net – .Net System.Mail.Message添加多个“To”地址的有价值信息。

本文目录一览:

c# – GetSystemMetrics()为.NET 4.5和.NET 4.0返回不同的结果(c# getresponse)

c# – GetSystemMetrics()为.NET 4.5和.NET 4.0返回不同的结果(c# getresponse)

在.NET 4.0期间 – > .NET 4.5应用程序迁移过程我发现了一种非常奇怪的行为.我已经能够将这个问题跟踪到这个简短的代码片段:
class Program
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int GetSystemMetrics(int nIndex);

    static void Main(string[] args)
    {
        const int CXFRAME = 0x20;
        const int CYFRAME = 0x21;

        var dx = GetSystemMetrics(CXFRAME);
        var dy = GetSystemMetrics(CYFRAME);

        Console.WriteLine("{0}x{1}",dx,dy);
        Console.ReadKey();
    }
}

使用Target Framework = 4.0(以及2.0,3.0,3.5)编译时,它输出8×8

使用Target Framework = 4.5编译时,它输出4×4

使用MSVS2012调试器运行此示例也始终输出4×4(使用任何目标框架).

其他选项(目标框架配置文件,目标平台,启用/禁用Aero)不会影响结果,唯一改变输出的是目标框架和运行调试器.我已经能够在3台计算机上重现这个问题,不幸的是它们在安装的软件方面几乎完全相同:

> Windows 7 Ultmate SP1(俄语,所有更新安装)与MSVS2012(英语/ rusian)更新1
> Windows 8(在虚拟机上)

目前我正在考虑修补一些.NET类(例如SystemParameters),它们使用反射调用GetSystemMetrics(),但我不确定如何获得正确的度量值.

问题:

>我错过了什么吗? GetSystemMetrics()如何受目标框架的影响?
>有没有办法从.NET 4.5应用程序调用GetSystemMetrics()并获得正确的结果?

我对解决这个问题的任何建议持开放态度.此外,如果您无法重现该问题,请在评论中留下简短的系统说明.

解决方法

根据微软的说法,这是按设计的.

有关详细信息,请参见此处

http://connect.microsoft.com/VisualStudio/feedback/details/763767/the-systemparameters-windowresizeborderthickness-seems-to-return-incorrect-value

https://connect.microsoft.com/VisualStudio/feedback/details/753224/regression-getsystemmetrics-delivers-different-values

尽管MS说这是“按设计”,但我仍然认为这是一个错误!

.NET 6 全新指标 System.Diagnostics.Metrics 介绍

.NET 6 全新指标 System.Diagnostics.Metrics 介绍

前言

工友们, .NET 6 Preview 7 已经在8月10号发布了, 除了众多的功能更新和性能改进之外, 在 preview 7 版本中, 也新增了全新的指标API, System.Diagnostics.Metrics, 为了让应用能有更好的可观测性, 在之前的发布的.NET 5中, 也把 Activity 增强为 ActivitySource, 主要原因还是 .NET 运行时团队和 OpenTelemetry .NET SIG 进行了深度合作, 并且一起制定了 OpenTelemetry .NET 指标计划。

Metric support plans[1]

Metrics APIs Design[2]

目前 System.Diagnostics.Metrics 这个api还只能在 .NET preview 7 中使用, 当然后边也会像 System.Text.Json 库一样发布到Nuget平台, 让其他版本的 .NET 项目接入使用。

指标介绍

下边介绍了几个主要的类

Meter 用来创建和跟踪指标InstrumentMeterListener 用来监听指标Instrument的值的更新Counter 计数器, 一般记录累加的值, 比如程序中的错误数, 请求数 都可以用计数器Histogram 直方图, 记录可统计的值, 比如记录下每一个接口的响应时间, 然后再根据时间进行汇总ObservableCounter 可观察计数器, 一般记录累加的值, 比如 CPU 时间等ObservableGauge 可观测仪表盘, 你可以用来记录应用的内存, GC 的内存等

Meter

Meter类用来创建各种指标Instrument, 包括计数器,直方图,仪表盘指标等等, Meter 类包含了 Name 和 Version 属性, 你可以设置meter的名称和版本。


var meter = new Meter("meter","v1.0");
var requestCount = meter.CreateCounter<long>("RequestCount");
var responseTime = meter.CreateHistogram<long>("ResponseTime");
// ...

MeterListener

MeterListener 可以用来监听指标组件的值变化, 同样相对应的也有 ActivityListener。

MeterListener listener = new MeterListener();
listener.InstrumentPublished = (instrument, meterListener) =>{ Console.WriteLine($"EnableMeasurementEvents {instrument.Name} "); meterListener.EnableMeasurementEvents(instrument);};
listener.SetMeasurementEventCallback<long>((instrument, measurement, tags, state) =>{ Console.WriteLine($"Instrument: {instrument.Name} has recorded the measurement {measurement}");});
listener.MeasurementsCompleted = (instrument, state) =>{ listener.DisableMeasurementEvents(instrument);};
listener.Start();

 

属性

  • InstrumentPublished 当使用Meter类创建指标Instrument时, 这个回调可以接收到创建的指标信息。

  • MeasurementsCompleted 当停止指标的收集时,这个回调可以接收到相应的指标信息, 通常是执行了 Meter 和 MeterListener 的Dispose() 方法

方法

  • EnableMeasurementEvents 开启相应指标Instrument的监听

  • DisableMeasurementEvents 关闭相应指标Instrument的监听

  • SetMeasurementEventCallback 设置指标Instrument的测量值更新的回调

  • RecordObservableInstruments 记录所有监听的可观察指标(Observable instruments)的当前测量值。

  • Start 开启监听指标Instrument。 

Counter 计数器

Counter是计数器指标,可以用来记录累加的值,使用非常简单,下边的示例中,模拟记录了程序的请求次数,首先调用 CreateCounter 函数创建一个计数器指标 requestCount, 然后调用Add 方法, 进行Counter的累加操作。

Meter meter = new Meter("meter","v1.0");
var requestCount = meter.CreateCounter<long>("RequestCount");
for (int i = 0; i < 10; i++){ requestCount.Add(1);}

然后使用上面的 MeterListener 来监听计数器指标, 程序的输出如下:

在第一行, MeterListener 检测到了上面创建的 RequestCount 计数器, 并且开启了指标的监听, 当我们调用 requestCount.Add(1) 后, MeterListener 捕获到了指标测量值的更新, 然后在控制台输出了相应的值, 需要注意的是, MeasurementEventCallback 回调方法只会捕获指标每次更新的测量值, 而不是汇总后的总数,所以这里的输出都是1。

Histogram 直方图

Histogram 是直方图指标,记录可统计的值, 比如记录下每一个接口的响应时间, 然后再根据时间进行汇总, 和 Counter 差不多, 不过指标的维度不一样, 而且 Histogram 使用Record()方法记录每次的值,而不是Add()方法。

Meter meter = new Meter("meter","v1.0");
var responseTime = meter.CreateHistogram<long>("ResponseTime");
for (int i = 0; i < 10; i++){ var cost = new Random().Next(100,1000);
responseTime.Record(cost);}

用随机数表示了接口的响应耗时, 输出如下:

ObservableCounter 可观察计数器

ObservableCounter 是可观察的计数器, 和 Counter 不一样的是, 创建 ObservableCounter 需要传入一个Func委托, 来返回一个测量值, 当然也不需要手动调用 Add(), Record() 方法, 只需要定时调用 MeterListener的RecordObservableInstruments 方法, 获取当前的指标测量值。

class Program { static async Task Main(string[] args) {
MeterListener listener = new MeterListener();
Start(listener);
AutoRecord(listener);

Meter meter = new Meter("meter","v1.0");
_ = meter.CreateObservableCounter<long>("CPU_Counter",() => new Random().Next(100,1000));
Console.ReadKey(); }
static void Start(MeterListener listener) { listener.InstrumentPublished = (instrument, meterListener) => { Console.WriteLine($"EnableMeasurementEvents {instrument.Name} "); meterListener.EnableMeasurementEvents(instrument); };
listener.SetMeasurementEventCallback<long>((instrument, measurement, tags, state) => { Console.WriteLine($"Instrument: {instrument.Name} has recorded the measurement {measurement}"); });
listener.MeasurementsCompleted = (instrument, state) => { listener.DisableMeasurementEvents(instrument); };
listener.Start();
}
static void AutoRecord(MeterListener listener) { var cts = new CancellationTokenSource();
_ = Task.Run(async () => {
while (!cts.IsCancellationRequested) { await Task.Delay(3000);
listener.RecordObservableInstruments();
}
});
}
}

ObservableGauge 仪表盘指标

这个比较好理解, 你可以用来记录应用的内存,GC 的内存等, 同样是可观察指标, 也需要传入一个返回测量值的func委托。

MeterListener listener = new MeterListener();
Start(listener);
AutoRecord(listener);
Meter meter = new Meter("meter","v1.0");
_ = meter.CreateObservableGauge<long>("GC_Memory_Gauge",() => GC.GetTotalMemory(false));
Console.ReadKey();

程序的输出如下:

总结

本文主要介绍了.NET 6 指标API System.Diagnostics.Metrics,通过这些API, 可以很方便的收集应用的指标数据, 但是本文好像没有提到数据的聚合汇总? 不要担心, 运行时团队针对相应的指标API已经开发了一系列高性能的聚合API, 预计在.NET 6 preview 8 中发布更新!

References

[1] Metric support plans: https://github.com/open-telemetry/opentelemetry-dotnet/issues/1501
[2] Metrics APIs Design: https://github.com/dotnet/designs/blob/3ac77d55eb00999fb2b03b280f209d08d3cd6ce9/accepted/2021/System.Diagnostics/Metrics-Design.md


本文分享自微信公众号 - dotNET跨平台(opendotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Amazon Textract 返回不同的结果在 WebApp Demo、AnalyzeDocumentRequest 和 StartDocumentAnalysisRequest 之间返回不同的结果

Amazon Textract 返回不同的结果在 WebApp Demo、AnalyzeDocumentRequest 和 StartDocumentAnalysisRequest 之间返回不同的结果

如何解决Amazon Textract 返回不同的结果在 WebApp Demo、AnalyzeDocumentRequest 和 StartDocumentAnalysisRequest 之间返回不同的结果?

这是我关于 StackOverFlow 的第一个问题,我想通过 Amazon Textract 从(扫描的)PDf 文档中提取键值对 (FORMS)。然而,我注意到的是,webapp 演示返回的一些键值对(https://us-east-2.console.aws.amazon.com/textract/home?region=us-east-2#/demo)可在代码中实现的方法中没有强>.

此外,在这两种方法之间同步方法(AnalyzeDocumentRequest),它不接受PDF但强制将文档预先转换为图像,在turn 查找键值对 (Sync Result Example) 异步方法没有。 (Async Result Example)

这个问题与这个人的问题类似,当他谈到两种分析文档的方法之间的结果差异时:AWS Textract - GetDocumentAnalysisRequest only returns correct results for first page of document

代码实现等同于这些示例:

  • 同步方法:https://docs.aws.amazon.com/textract/latest/dg/examples-extract-kvp.html
  • 异步方法:https://github.com/awsdocs/amazon-textract-developer-guide/blob/master/doc_source/async-analyzing-with-sqs.md

有人遇到过同样的问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

android-TelephonyManager.getDeviceId(0)返回不同的结果

android-TelephonyManager.getDeviceId(0)返回不同的结果

由于某些特定原因,我需要在Android应用程序中获取IMEI.这是我使用的代码:

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
    // API available only >= 6.0
    // Get first slot to avoid issue if we have multiple sim cards
    String imei = tm.getdeviceid(0);
}
else
{
    String imei = tm.getdeviceid();
}

在大多数情况下,它都能正常工作.但是,某些设备(例如Huawei Honor 7)提供双卡功能.在设置中,用户可以在两张支持3G / 4G的SIM卡之间进行切换.

当我有两个SIM卡并且执行该切换时,我得到的IMEI是不同的.

据我所知,IMEI与物理插槽有关,不应更改.从构造函数看,这似乎是不好的实现.

有解决方法的主意吗?

解决方法:

正如您所说,IMEI /设备ID已标记为sim插槽.

对于双SIM卡手机,有三个IMEI值(每个插槽一个)和IMEI-SV.

假设广告位1的IMEI为:123456789012345

插槽2的IMEI为:012500123456789

根据情况,以下是telephonyManagerObj.getdeviceid()返回的值:

>如果您没有任何SIM卡,则该方法将返回插槽1的IMEI,即123456789012345
>如果插槽1中有SIM卡,则该方法将返回插槽1的IMEI,即123456789012345
>如果两个插槽中都装有SIM卡,则该方法将返回插槽1的IMEI,即123456789012345
>但是,如果仅插槽2中有SIM卡,则该方法将返回插槽2的IMEI,即012500123456789
>我发现在一台设备上,当我将SIM卡错误地插入插槽1时,该方法返回了IMEI-SV

保持一致性的一种解决方法是,一旦成功设法将IMEI存储在SharedPreference / sqlite中.

因此,当您在代码中需要IMEI值时,可以首先检查它在本地存储中是否可用.如果不可用,则检索IMEI并将其存储以备下次使用.

请注意,Android O已弃用getDeviceId().请检查this so,以备不时之需

asp.net – .Net System.Mail.Message添加多个“To”地址

asp.net – .Net System.Mail.Message添加多个“To”地址

编辑:这个问题是无意义的,除了作为一个练习在红色herrings。这个问题结果是我的愚蠢的组合(NO ONE是通过电子邮件发送,因为主机没有被指定,在web.config中不正确),用户告诉我,他们有时得到电子邮件,有时没有,当在现实中,他们从来没有得到电子邮件。

因此,我不是采取适当的步骤在受控的环境中重现问题,而是依赖于用户信息和“它在我的机器上工作”的心态。
好的提醒我自己和任何人在那里有时是一个白痴。

我只是碰到我认为不一致的东西,想看看我做错了什么,如果我是个白痴,或者…

MailMessage msg = new MailMessage();
msg.To.Add("person1@domain.com");
msg.To.Add("person2@domain.com");
msg.To.Add("person3@domain.com");
msg.To.Add("person4@domain.com");

真的只发送这封电子邮件给1个人,最后一个。

要添加多个,我必须这样做:

msg.To.Add("person1@domain.com,person2@domain.com,person3@domain.com,person4@domain.com");

我不明白。我以为我要添加多个人到地址集合,但我正在做的是替换它。

我想我只是意识到我的错误 – 添加一个项目到集合,使用
.To.Add(new MailAddress(“person@domain.com”))

如果你只使用一个字符串,它会取代它在它的列表中的一切。
编辑:其他人已经测试,没有看到这种行为。这是我的特定版本的框架中的错误,或者更可能是我的白痴操作。

啊。我认为这是一个相当大的骗子!因为我回答了我自己的问题,但我认为这是有价值的在stackoverflow存档,我仍然会问。也许有人甚至有一个想法,你可以陷入其他陷阱。

解决方法

我无法复制您的错误:
var message = new MailMessage();

message.To.Add("user@example.com");
message.To.Add("user2@example.com");

message.From = new MailAddress("test@example.com");
message.Subject = "Test";
message.Body = "Test";

var client = new SmtpClient("localhost",25);
client.Send(message);

倾销的内容To:MailAddressCollection:

MailAddressCollection (2 items)
displayName User Host Address

user example.com user@example.com
user2 example.com user2@example.com

而由此产生的电子邮件被抓住smtp4dev:

Received: from mycomputername (mycomputername [127.0.0.1])
     by localhost (Eric Daugherty's C# Email Server)
     3/8/2010 12:50:28 PM
MIME-Version: 1.0
From: test@example.com
To: user@example.com,user2@example.com
Date: 8 Mar 2010 12:50:28 -0800
Subject: Test
Content-Type: text/plain; charset=us-ascii
Content-transfer-encoding: quoted-printable

Test

您确定您的代码或SMTP服务器没有发生其他问题吗?

关于c# – GetSystemMetrics()为.NET 4.5和.NET 4.0返回不同的结果c# getresponse的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于.NET 6 全新指标 System.Diagnostics.Metrics 介绍、Amazon Textract 返回不同的结果在 WebApp Demo、AnalyzeDocumentRequest 和 StartDocumentAnalysisRequest 之间返回不同的结果、android-TelephonyManager.getDeviceId(0)返回不同的结果、asp.net – .Net System.Mail.Message添加多个“To”地址等相关内容,可以在本站寻找。

本文标签:

上一篇c# – ASP.NET Session和LINQ(asp.net session用法)

下一篇c# – 如何使用OpenXML SDK将Excel转换为CSV?(openxml格式)