我想创建所有ViewModel的字典.
public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>();
Run Code Online (Sandbox Code Playgroud)
像这样添加它
vmCollection.Add(name, new WeakReference(viewModel));
Run Code Online (Sandbox Code Playgroud)
并调用这样的必需方法..
((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message);
Run Code Online (Sandbox Code Playgroud)
我需要保持它WeakReference吗?如果我不把它作为一个例子,可能会有什么后果WeakReference.
我一直在试图实现一个Stream支持ReadAsync和WriteAsync,并给予的spareseness 文档,我挣扎,以了解如何正确地这样做.具体来说,就流的光标位置而言.这里和这里有关于旧BeginRead功能的类似问题.该函数的文档似乎表明,BeginRead在任何挂起的异步操作完成之前不应再次调用.
鉴于BeginRead现在过时 不再建议新的发展,并Stream可能已经被显著改变,以实施新的异步功能,事情再次不清楚.(编辑:通常这种警告意味着新函数是直接实现的,旧函数调用新函数,并且仅用于向后兼容,但这似乎并非如此).
在ReadAsync和WriteAsync函数定义,使得它们不采取所需的读/写流位置作为自己的Win32 同行做(在我看来,一个非常贫穷的设计选择),而是依赖于由流实现保持的当前位置.如果两个条件之一成立,那么情况就好了:
ReadAsync并且WriteAsync必须获取当前光标位置以供操作使用并更新它,就好像操作完成(或根本不更新)返回之前Task,或者ReadAsync或WriteAsync可以调用.在这两个条件之外,调用者永远无法确定读或写将发生的位置,因为挂起的异步操作可能会在任何Seek调用ReadAsync或调用之间改变流的位置WriteAsync.这些条件都没有记录为要求,所以我不知道它应该如何运作.
我的白盒测试似乎表明,至少对于FileStream版本Stream,流位置异步更新,这似乎表明第二个条件(只允许一个待处理操作)仍然是需要的那个,但这似乎是一个严重的限制(它肯定会排除任何类型的内部分散 - 聚集实现).
任何人都可以提供任何类型的权威信息,以确定旧的BeginRead限制是否仍然适用ReadAsync?
我们已经并行运行了多年的单元测试(有和没有代码覆盖),遵循以下说明: 如何并行运行单元测试(MSTest)? 在这里: 并行运行单元测试
但是,Visual Studio 2017的最新更新(版本15.5.0或15.5.1及更高版本)似乎打破了这一点,每当我尝试使用自定义测试设置文件并执行代码覆盖时,我现在都会收到以下错误分析:
[12/29/2017 1:35:10 PM Error] Microsoft.VisualStudio.TestPlatform.ObjectModel.SettingsException: Data collectors configured via run settings are not supported with embedded test settings. Please see https://aka.ms/vstest-configure-datacollector for more information. Run settings:
Run Code Online (Sandbox Code Playgroud)
我已在另一个系统上更新,重新启动并验证了此问题.
当恢复到默认设置(没有自定义测试设置文件)并使用VS 2015更新2中引入的"并行运行测试"按钮时,它似乎只是忽略按钮设置并连续运行测试(无论您是否进行代码覆盖) ).
我查看了错误中提供的链接(https://github.com/Microsoft/vstest-docs/blob/master/docs/analyze.md),但它没有帮助澄清问题,除了可能表明是的,改变了.
如果我关闭自定义设置文件,测试运行得很好,但运行时间大约是7倍,这非常令人沮丧.
如何在VS 2017 15.5+中使用并行单元测试执行?
c# unit-testing vs-unit-testing-framework visual-studio-2017
我有几个服务器农场,一个有Server 2008 R2一个,有一个Server 2012 R2.经过一堆搜索,我发现以下powershell禁用默认的IIS应用程序池回收,我在管理PowerShell提示符下运行:
Set-ItemProperty IIS:\AppPools\Test -Name Recycling.PeriodicRestart.Time -Value 0
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常(它在任何平台上都没有任何输出运行),但是当我随后尝试查询值时Server 2008 R2,我得到这个:
PSPath : WebAdministration::\\SERVER1\AppPools\Test
PSParentPath : WebAdministration::\\SERVER1\AppPools
PSChildName : Test
PSDrive : IIS
PSProvider : WebAdministration
IsInheritedFromDefaultValue : False
IsProtected : False
Name : time
TypeName : System.TimeSpan
Schema : Microsoft.IIs.PowerShell.Framework.ConfigurationAttributeSchema
Value : 00:00:00
IsExtended : False
Run Code Online (Sandbox Code Playgroud)
但是Server 2012 R2,我明白了:
PSPath : WebAdministration::\\SERVER2\AppPools\Test
PSParentPath : WebAdministration::\\SERVER2\AppPools
PSChildName : Test
PSDrive : IIS
PSProvider : WebAdministration
IsInheritedFromDefaultValue : True
IsProtected …Run Code Online (Sandbox Code Playgroud) 今天,我遇到了一个有趣的问题,即使在使用相同配置的情况下,我的测试在构建机器上也能正常运行时,在构建机器上始终无法通过测试。当我查看故障转储中Assert.AreEqual输出的差异时,看不到任何差异。经过一番调查,我发现测试用例源代码中的逐字字符串(跨越多行)在我的计算机上使用CRLF,但在构建计算机上使用LF,导致该字符串与生成的字符串进行比较字符串失败。罪魁祸首是两个系统上的Git设置不一致,构建系统会自动将CRLF序列转换为LF。
C#规范是否说明了应如何解释逐字字符串中的换行符(也许使用Environment.Newline或至少是一些一致的东西)?这似乎是一个问题,可能会以非常难以诊断和解决的方式(特别是使用.NET Standard)咬伤很多人。例如,如果您有一个.NET Standard项目,并且在Linux和Windows上都有团队成员,则这很可能会伤及Linux团队成员或Windows团队成员。
我一直在研究使用并在更改通知中AsyncLocal发现了ThreadContextChanged的属性。AsyncLocalValueChangedArgs<T>由于通常几乎不存在文档,
我对它的用途感到困惑(从文档中可以清楚地看出,只有在未显式更改异步值时才设置此值,但这是唯一清楚的事情)。
这里只有一个与此相关的其他问题(AsyncLocal Value Updated to null on ThreadContextChanged),它指的是调用者收到更改通知的情况,该值设置为 true 并且新值设置为 null,这是意外的。我更关心的是:
我的理解是,它AsyncLocal用于应与异步执行上下文一起携带的值,当连续在线程之间移动时根据需要跨越线程边界。
我可以理解在显式更改值时需要委托,但在未显式更改时更改值(似乎是此属性所指示的)对我来说似乎是无意义的。
在没有明确改变的情况下,值如何改变?上下文可以改变,但上下文中的值不应该改变——这就是类的全部要点。
上下文的改变根本不是值的改变——这是完全不同的事情。毕竟,该类包含多个值,并且添加附加值与现有值的突变是非常不同的操作,将它们放入同一个通知中而几乎没有任何解释来解释上述问题似乎是故意的令人困惑。
从 4.7.0更新System.Security.Cryptography.Xml到 5.0.0 或 6.0.0 后,对我的代码没有其他更改,我得到了一个NullReferenceExceptionin IsKeyTheCorrectAlgorithm. 所使用的证书是使用 CNG、CAPI 和 OpenSSL 创建的 SHA1 和 SHA256 自签名证书。
我已经使用System.Security.Cryptography.X509Certificates.X509Store了一段时间来枚举机器上的所有 TLS 证书(在代码中验证重定向到 SSL 是否有效并在证书丢失时发出警告)。我有以下列表功能可以帮助我诊断问题,例如我现在遇到的问题,但我似乎找不到我需要的数据:
System.Security.Cryptography.X509Certificates.X509Store store = new System.Security.Cryptography.X509Certificates.X509Store(System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine);
store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly);
DateTime utcNow = DateTime.UtcNow;
foreach (System.Security.Cryptography.X509Certificates.X509Certificate2 mCert in store.Certificates)
{
writer.WriteStartElement("certificate");
writer.WriteAttributeString("friendlyName", mCert.FriendlyName);
writer.WriteAttributeString("subjectName", mCert.SubjectName.Name);
writer.WriteAttributeString("subject", mCert.Subject);
writer.WriteAttributeString("simpleName", mCert.GetNameInfo(System.Security.Cryptography.X509Certificates.X509NameType.SimpleName, false));
writer.WriteAttributeString("dnsName", mCert.GetNameInfo(System.Security.Cryptography.X509Certificates.X509NameType.DnsName, false));
writer.WriteAttributeString("certhash", mCert.GetCertHashString());
writer.WriteAttributeString("effectivedate", mCert.GetEffectiveDateString());
writer.WriteAttributeString("expirationdate", mCert.GetExpirationDateString());
writer.WriteAttributeString("format", mCert.GetFormat());
writer.WriteAttributeString("keyalgorithm", mCert.GetKeyAlgorithm());
writer.WriteAttributeString("publickey", mCert.GetPublicKeyString());
writer.WriteAttributeString("serialnumber", mCert.SerialNumber);
writer.WriteAttributeString("hasprivatekey", XmlConvert.ToString(mCert.HasPrivateKey));
writer.WriteAttributeString("issuer", mCert.Issuer);
// NOTE: X509Certificate2 as provided by .NET uses local datetimes, so we need to convert them to the sane choice of UTC here
writer.WriteAttributeString("notafterutc", XmlConvert.ToString(mCert.NotAfter.ToUniversalTime(), XmlDateTimeSerializationMode.Utc)); …Run Code Online (Sandbox Code Playgroud) 我找到了许多与Windows上的 .NET Core 3.1 和 .NET 5.0 相关的答案,但到目前为止,还无法找到如何在使用单文件可执行文件时在Linux上获取 .NET Core 下的原始程序集位置。鉴于系统的行为不同,我认为这可能是 .NET 5 中的一个错误,但同时我需要一个解决方法。请注意,在我的场景中,当前目录不是原始可执行文件所在的位置,即使我不更改它,并且我无法控制它(无论如何,这是一个黑客 - 当前目录的目的完全不同) )。这是在这种情况下测试程序的实际输出,其中包含迄今为止我能找到的所有其他帖子中建议的属性和函数:
Directory.CurrentDirectory()=/home/ec2-user/source
typeof(Program).Assembly.Location=/root/.net/Test/jwaxs3pc.bdp/Test.dll
typeof(Program).Assembly.GetFiles() [0].Name=/root/.net/Test/jwaxs3pc.bdp/Test.dll
typeof(Program).Assembly.GetName().CodeBase=file:///root/.net/Test/jwaxs3pc.bdp/Test.dll
AppContext.BaseDirectory=/root/.net/Test/jwaxs3pc.bdp/
Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName=/root/.net/Test/jwaxs3pc.bdp
Run Code Online (Sandbox Code Playgroud)
我需要找到原始代码位置,而不是单文件可执行文件解压到的位置。我如何获得这些最基本的信息?是否没有一种独立于平台和设置的方法来做到这一点(确实应该有)?
SynchronizationContext除非您在、TaskScheduler、 、 async/await 和多处理方面拥有丰富的经验TaskFactory,否则无需进一步阅读。
在过去的几年里,我参与了一个大型的整体式 C# 项目,该项目从 .NET 2.0 开始,一直升级到我们在过去 15 年里一直致力于开发的 .NET 4.72,并将其迁移到 .NET 5 /6 是为了摆脱现已被有效弃用的 4.72,并最终将其托管在 Linux 上,同时保持其在生产环境中 24/7 运行,拥有超过 100 万用户。
在此过程中,我开始欣赏 async/await 概念的优雅,但也对其表现不明智的地方感到非常沮丧。
我已经接受了大多数怪癖,但通过这个过程,.NET Core(此时为 .NET 6)似乎是一个主要用于用户交互软件的框架,而不是其他软件的框架。队列处理等目的。.NET Core 中的 async/await 似乎主要是为了处理围绕旧的 Windows 消息泵 UI 和 ASP.NET 每个请求一个执行流构建的应用程序而设计的,排除了一些其他架构。
让我详细说明一下。在这些更新之前,我们的大部分代码使用自定义线程池进行后端处理。
考虑到项目的性质(一半前端 Web API 服务和一半无头后端队列处理)以及优化成本的需要,我们努力将后端处理服务器上的 CPU 利用率保持在 97% 附近,并且我们正在利用并行处理也适用于一些前端操作。我们发现,对于任何系统,如果 CPU 利用率远高于 97%,您将无法监控服务器上正在发生的情况,也无法在无限循环不可避免地发生时检测到它们。我们的算法可以很好地实现大约这个利用率水平。我们定制线程池有几个原因:
ThreadPool,因为它不是 FIFO,不可避免地会导致一些长时间排队的操作挨饿,而有利于最近排队的操作,从而导致超时和其他难题。当 FIFO 处理引擎可以通过以更合理的 FIFO 顺序处理事物来避免超时时,对此进行补偿既浪费又乏味。PendingWorkItemCount几乎ThreadCount可以做到这一点,但在实践中,我没有无法提出一种对任意工作负载都可靠的算法)。因此,多年来,使用默认线程池以及除玩具代码之外的任何内容都无法实现持续 95% 以上的 …
c# multithreading asynchronous task-parallel-library async-await
在使用foreach枚举内容之前添加对集合计数的检查是否会有任何性能改进?
if (users.Count != 0) {
foreach (var user in users) {
// do what snowmen do in summer
}
}
Run Code Online (Sandbox Code Playgroud)
与
foreach (var user in users) {
// do what snowmen do in summer
}
Run Code Online (Sandbox Code Playgroud)
我的功能花了太长时间,所以我想知道这是否会提高性能甚至一点点,以使我的功能执行时间降到我需要的地方.
编辑(此循环执行的上下文):
for (DateTime day = dayStart; day < dayEnd; day = day.addMinutes(30)) {
// Other actions
if (users.Count != 0) {
foreach (var user in users) {
// do what snowmen do in summer
}
}
}
Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×3
async-await ×3
.net-5 ×2
.net-core ×1
asynchronous ×1
c#-5.0 ×1
filestream ×1
foreach ×1
if-statement ×1
linux ×1
newline ×1
node.js ×1
optimization ×1
powershell ×1
ssl ×1
stream ×1
unit-testing ×1
wpf ×1
x509 ×1