我想知道是否可以获取枚举值的属性而不是枚举本身的属性?例如,假设我有以下枚举:
using System.ComponentModel; // for DescriptionAttribute
enum FunkyAttributesEnum
{
[Description("Name With Spaces1")]
NameWithoutSpaces1,
[Description("Name With Spaces2")]
NameWithoutSpaces2
}
Run Code Online (Sandbox Code Playgroud)
我想要的是枚举类型,产生2元组的枚举字符串值及其描述.
价值很容易:
Array values = System.Enum.GetValues(typeof(FunkyAttributesEnum));
foreach (int value in values)
Tuple.Value = Enum.GetName(typeof(FunkyAttributesEnum), value);
Run Code Online (Sandbox Code Playgroud)
但是如何获取描述属性的值,以填充Tuple.Desc?如果属性属于枚举本身,我可以想到如何做到这一点,但我不知道如何从枚举的值中获取它.
在我可以找到的所有示例中HttpClient,它用于一次性呼叫.但是,如果我有一个持久的客户端情况,可以同时进行多个请求怎么办?基本上,client.PostAsync对同一个实例一次调用2个线程是安全的HttpClient.
我不是在寻找实验结果.作为一个工作示例可能只是一个侥幸(并且持久的),一个失败的例子可能是一个错误的配置问题.理想情况下,我正在寻找HttpClient中并发处理问题的一些权威答案.
我的问题是2倍,我希望WPF提供的解决方案更容易,而不是WinForms的标准解决方案(在我做出澄清之前Christophe Geers提供的解决方案).
首先,有没有一种方法可以在不捕获和处理鼠标点击+拖动事件的情况下使窗口可拖动?我的意思是窗口可以通过标题栏拖动,但如果我设置一个窗口没有一个并且仍然希望能够拖动它,有没有办法只是将事件重新指向任何处理标题栏拖动的处理?
第二,有没有办法将事件处理程序应用于窗口中的所有元素?同样,无论用户点击哪个元素+拖动,都可以使窗口可拖动.显然,没有手动添加处理程序,每个元素.在某个地方做一次吗?
MSDN 在C#中给出了关于lock关键字的以下警告:
通常,避免锁定公共类型或超出代码控制范围的实例.常见的构造锁(this),lock(typeof(MyType))和lock("myLock")违反了这个指南:
Run Code Online (Sandbox Code Playgroud)* lock (this) is a problem if the instance can be accessed publicly. * lock (typeof (MyType)) is a problem if MyType is publicly accessible.
然而,它没有为它提供任何可靠的推理.锁(这个)在这里解释了SO.我对lock(typeof(MyType))案件感兴趣.有什么危险吗?
谢谢.
如果你感兴趣的话,也会在这里提出一个非常类似的问题,但正如我们将会看到那个问题的接受答案并非总是如此(我的应用程序使用模式从来都不是这样).
性能确定代码由FileStream构造函数(用于打开文件)和SHA1哈希(.Net框架实现)组成.代码几乎是我在上面链接的问题中提到的C#版本.
情况1:应用程序第一次或第N次启动,但设置了不同的目标文件.现在告诉应用程序计算之前从未访问过的文件的哈希值.
案例2:应用程序现已完全终止,并再次启动,要求计算相同文件的哈希值:
问题
我的应用程序始终在使用案例1.永远不会要求它重新计算已经访问过一次的文件的哈希值.
所以我的速率决定步骤是FileStream Constructor!有什么办法可以加速这个用例吗?
谢谢.
使用JetBrains分析器收集PS统计数据.
这个问题是对C#事件和线程安全问题的跟进(我不是那个问题的作者)和Eric Lippert Events and Races的相关博客文章.关于SO还有其他类似的问题,但他们都没有真正考虑过这个案例,普遍的共识是只要你取消订阅就是安全的,但我不相信这一直是真的.
根据SO问题和博客中的讨论,应该使用的模式类似于:
var ev = NotifyPropertyChanged;
if (ev != null)
ev(this, new PropertyChangedEventArgs("Foo"));
Run Code Online (Sandbox Code Playgroud)
但是如果出现以下情况怎么办:
1)我订阅了一个监听器:
mytype.NotifyPropertyChanged += Handler; // Handler is instance method in SomeObject class
Run Code Online (Sandbox Code Playgroud)
2)I(或运行时,由于作用域)在几乎同时发生属性通知的同时处理SomeObject,它包含监听器并取消订阅监听器.
3)虽然由于非常短的时间段可能发生这种情况,但理论上可能因为ev保留了不再存在的旧订户,它将在不再存在的对象中调用函数.
根据Eric Lippert的说法," 即使在事件被取消订阅之后,事件处理程序也必须是强大的." 但是如果处理程序被取消订阅并处理掉,它就不能再处理这个电话了.处理这种情况的正确方法是什么?
在try-catch中包装(1)中的代码?应该抓住什么例外?我认为ObjectDisposedException似乎很可能,但不是唯一可能发生的事件.
我最近一直在阅读Effective C#和其他一些这样的书籍/博客,当谈到标准的Dispose模式(我已经使用过)时,他们都建议使用类' dispose变量(在MSDN示例代码中定义),每个方法的开头.基本上确保一旦调用Dispose,任何使用该对象的尝试都将导致ObjectDisposedException.这是有道理的,但是在足够大的代码库中有大量的手工劳动,并依赖于人们记住这样做.所以我正在寻找更好的方法.
我最近遇到并开始使用notifypropertyweaver,它自动填写调用PropertyChanged处理程序的所有样板代码(作为msbuild任务,因此不需要额外的运输依赖).我想知道是否有人知道标准配置模式的类似解决方案.它本质上要做的是接受一个变量名作为config(bool disposed在MSDN的示例中),并将以下代码添加到每个不是Finalizer的方法中,或者在实现IDisposable的每个类中命名为Dispose:
if(disposed)
throw new ObjectDisposedException();
Run Code Online (Sandbox Code Playgroud)
这样的事情存在吗?或者人们如何在他们的代码中实现这一点,手动添加if语句?
澄清目的
对此的更大需求不是某种"最佳实践"驱动,而是我们确实让用户不正确地管理我们对象的生命周期.现在他们只是从底层资源获得NullReference或其他一些这样的东西,这可能意味着我们的库中有一个bug,我想告诉他们他们是创建问题的人以及他们如何创建它(考虑到我我知道的位置.因此,建议我们的类型的用户应该是应该照顾的人,这里的效率并不高.
关于VS2010可能过于严格地应用代码分析规则CA2000的事实,有很多问题,但我似乎遇到了应该应用它的情况,但事实并非如此.
请考虑以下代码:
Image srcImage = Image.FromFile(source);
Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics gr = Graphics.FromImage(newImage))
{
gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}
newImage.Save(destination, ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)
现在,如果我在Visual Studio 2010中运行Code Analysis,它会抱怨newImage没有处理(很容易修复,把它放在另一个使用块),但是它没有抱怨srcImage(它也有Dispose()方法)我永远不会打电话).有谁知道为什么Code Analysis不会在这里抱怨?
我面临以下问题,此时我觉得我严重缺乏某种工具,我只是不知道该工具是什么,或者它到底应该做什么。
这是设置:我有一个必须在 GAC 中注册的第 3 方 DLL。这一切在我们之前部署过软件的几乎每台机器上都运行良好。但是现在我们有 2 台机器,看起来和我们知道的机器完全一样(它们是从同一个镜像克隆出来的,并塞满了相同的硬件,所以几乎唯一的区别是软件设置,我一遍又一遍地检查,然后他们看起来不错)。
现在问题来了,GAC中的DLL加载时间很长。至少我相信这是问题所在,我可以明确地说,从该 DLL 实例化单个类是缓慢的部分。一旦加载,事情就会像往常一样飞翔。但是,虽然在已知良好的机器上,DLL 加载速度如此之快,以至于日志中的时间戳甚至都不会改变,但在这 2 台机器上,加载时间超过 1 分钟。
已知信息:我无法访问源代码,因此无法通过 DLL 进行调试。我们的应用程序是唯一使用它的应用程序(因此不应该是同时访问问题)。这个 DLL 只存在一个版本,所以应该不是版本冲突的问题。正在使用 GAC 引用(如果我从 GAC 卸载 DLL,将引发关于缺少 GAC 引用的异常)。
在 debug-fu 方面具有更高技能的人能否建议我可以做些什么来追踪此问题的根本原因?
让我们以博客引擎为例.
你有博客,博客有帖子,帖子有标签用于组织目的.在确定RDBMS环境中的标记问题并不简单之后,我们会去谷歌寻求指导,并找到以下关于解决方案的简洁摘要:设计和相关基准.但是,所有这些都是以性能或复杂性为代价的.看起来像NoSQL一样让你在列中存储标签列表(在NoSQL中我们可以将文档存储在文档中)可以很好地解决问题.为什么不用SQLServer/Qracle/MySQL/Postgres /等.那么呢?
起初我以为可能是因为尺寸不一.但任何值得注意的RDBMS都允许使用某种形式的varchar和text(大小相当).因此,列的大小(以及不同行中的相同列具有不同大小的事实不是问题).因此,不要存储blob文本,而是让我们在列中存储相同类型的项目列表(大多数语言中的数组).让我们为有效的精确搜索匹配编制索引.至少对于我需要NoSQL DB的所有用例都会在必要时消失(我知道很多人都在讨论可扩展性,但我不太了解/关心它,我没有可伸缩性问题,我有维护噩梦).我们的架构设计简单(每一点都像NoSQL文档中的文档一样干净简单),并且由于高效的索引而具有出色的性能.更奇怪的是,开源数据库(例如Postgres)没有针对此功能的某种补丁.如今,在这些领域充满动力的开发人员似乎很想从头开始创建新的数据库.
我是否遗漏了一些令人震惊的技术障碍,或者前面提到的RDBMS供应商是懒惰还是过去?
c# ×7
.net ×4
dispose ×2
performance ×2
c#-4.0 ×1
concurrency ×1
database ×1
dll ×1
enums ×1
events ×1
gac ×1
hard-drive ×1
locking ×1
reflection ×1
windows ×1
wpf ×1