我现在正在学习多线程,在C#中学习,但与所有学习一样,我喜欢学习最佳实践.目前该地区似乎模糊不清.我理解基础知识,我可以创建线程.
在创建多线程应用程序时,我应该注意什么.是否有任何我应该了解的规则或最佳实践?或者要记住什么以避免滑倒线?
谢谢你的回复.
我有以下代码:
DirectoryInfo directory = new DirectoryInfo(@"C:\Program Files\Company\Product");
if (!directory.Exists) { directory.Create(); }
DirectorySecurity directorySecurity = directory.GetAccessControl();
SecurityIdentifier securityIdentifier = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
directorySecurity.AddAccessRule(
new FileSystemAccessRule(
securityIdentifier,
FileSystemRights.Write,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow));
directory.SetAccessControl(directorySecurity);
Run Code Online (Sandbox Code Playgroud)
对AddAccessRule的调用将引发带有以下堆栈跟踪的InvalidOperationException:
System.InvalidOperationException: This access control list is not in canonical form and therefore cannot be modified.
at System.Security.AccessControl.CommonAcl.ThrowIfNotCanonical()
at System.Security.AccessControl.CommonAcl.AddQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, Int32 accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
at System.Security.AccessControl.DiscretionaryAcl.AddAccess(AccessControlType accessType, SecurityIdentifier sid, Int32 accessMask, InheritanceFlags inheritanceFlags, PropagationFlags …Run Code Online (Sandbox Code Playgroud) 我有一个在Tomcat 7上运行的Java Web应用程序似乎有内存泄漏.应用程序的平均内存使用量在负载下随着时间线性增加(使用JConsole确定).在内存使用率达到稳定水平后,性能会显着下降.响应时间从~100ms到[300ms,2500ms],所以这实际上是造成实际问题.
我的应用程序的JConsole内存配置文件:

使用VisualVM,我看到至少有一半的内存被字符数组(即char [])使用,并且字符串的大多数(大致相同数量的每个,300,000个实例)是以下之一:"分配失败" ,"复制","次要GC的结束",所有这些似乎都与垃圾收集通知有关.据我所知,应用程序根本不监视垃圾收集器.VisualVM找不到任何这些字符串的GC根,所以我很难跟踪它.
内存分析器堆转储:

我无法解释为什么内存使用量会如此高,但我有一个关于为什么性能一旦降低就会降低的理论.如果内存碎片化,应用程序可能需要很长时间才能分配连续的内存块来处理新请求.
将其与内置的Tomcat服务器状态应用程序进行比较,内存会增加并保持稳定,但不会像我的应用程序那样达到很高的"底限".它也没有大量无法访问的char [].
Tomcat服务器状态应用程序的JConsole内存配置文件:

Tomcat服务器状态applicationp的内存分析器堆转储:

这些字符串可以在哪里分配,为什么它们不被垃圾收集?是否存在可能影响此问题的Tomcat或Java设置?是否有特定的包可能会影响这个?
这是我的测试代码:
String foo = new String();
System.out.println(foo);
Run Code Online (Sandbox Code Playgroud)
输出为空白并写入新行.由于我是Java的新手,我不知道它是否是一个""字符串,或者空值是作为空行处理的.
该System.Collections.ObjectModel.KeyedCollection类是一个非常有用的替代System.Collections.Generic.Dictionary,尤其是当关键数据是存储对象的一部分,或者您希望能够枚举顺序的项目.不幸的是,这个类是抽象的,我无法在核心.NET框架中找到一般的具体实现.
该框架的设计Guidlines书表明,一个具体的实现应为抽象类型(第4.4节抽象类设计)来提供.为什么框架设计者会忽略这样一个有用的类的一般具体实现,特别是当它可以通过简单地暴露一个接受并将Converter从项目存储到其键的构造函数来提供时:
public class ConcreteKeyedCollection<TKey, TItem> : KeyedCollection<TKey, TItem>
{
private Converter<TItem, TKey> getKeyForItem = null;
public ConcreteKeyedCollection(Converter<TItem, TKey> getKeyForItem)
{
if (getKeyForItem == null) { throw new ArgumentNullException("getKeyForItem"); }
this.getKeyForItem = getKeyForItem;
}
protected override TKey GetKeyForItem(TItem item)
{
return this.getKeyForItem(item);
}
}
Run Code Online (Sandbox Code Playgroud) 当通过F10逐行单步执行C#代码时,调试器需要一秒钟才能到达下一行.
我已经尝试删除所有手表和断点,但这没有任何区别.
这是正常的吗?很长一段时间以来都是这样,所以我甚至不记得这是否更好.我的开发计算机是一台四核机器,没有后台任务活动,剩下大量内存.
如果这不正常,我还能尝试什么?它仍然可以使用,但一个不那么迟钝的用户界面将是伟大的...
我用C#创建了Windows Form程序.本地化有一些问题.我有2种语言的资源文件(一种用于英语,另一种用于法语).我想单击每个语言按钮并在运行时更改语言.
但是,当我点击按钮时,它不起作用.我正在使用此代码.
private void btnfrench_Click(object sender, EventArgs e)
{
getlanguage("fr-FR");
}
private void getlanguage(string lan)
{
foreach (Control c in this.Controls)
{
ComponentResourceManager cmp =
new ComponentResourceManager(typeof(BanksForm));
cmp.ApplyResources(c, c.Name, new CultureInfo(lan));
}
}
Run Code Online (Sandbox Code Playgroud)
请问有什么帮助......
非常感谢....
根据MSDN,当HttpWebRequest.AllowAutoRedirect属性为true时,重定向将清除身份验证标头.给出的解决方法是实现IAuthenticationModule来处理身份验证:
在自动重定向时清除Authorization标头,HttpWebRequest会自动尝试重新验证重定向的位置.实际上,这意味着如果可能遇到重定向,则应用程序无法将自定义身份验证信息放入Authorization标头中.相反,应用程序必须实现并注册自定义身份验证模块.System.Net.AuthenticationManager和相关类用于实现自定义身份验证模块.AuthenticationManager.Register方法注册自定义身份验证模块.
我创建了这个接口的基本实现:
public class CustomBasic : IAuthenticationModule
{
public CustomBasic() { }
public string AuthenticationType { get { return "Basic"; } }
public bool CanPreAuthenticate { get { return true; } }
private bool checkChallenge(string challenge, string domain)
{
if (challenge.IndexOf("Basic", StringComparison.InvariantCultureIgnoreCase) == -1) { return false; }
if (!string.IsNullOrEmpty(domain) && challenge.IndexOf(domain, StringComparison.InvariantCultureIgnoreCase) == -1) { return false; }
return true;
}
public Authorization PreAuthenticate(WebRequest request, ICredentials credentials)
{
return authenticate(request, credentials);
}
public Authorization …Run Code Online (Sandbox Code Playgroud) 我有一个MSI,在安装过程中创建并启动Windows服务,并在卸载过程中停止并删除该服务.这在单独安装和卸载时工作正常,但在升级时,将显示"正在使用的文件"对话框(仅在Vista及更高版本,因为新的重新启动管理器),表明该服务正在使用中.
InstallValidate自定义操作在InstallExecute序列期间显示"正在使用的文件"对话框,该操作紧接在RemoveExistingProducts自定义操作之前安排; 这意味着尚未卸载以前的版本,因此应显示"正在使用的文件"对话框.
MSDN文档指出必须在InstallValidate操作之后安排RemoveExistingProducts操作,并且我当前在InstallValidate操作之后立即安排RemoveExistingProducts操作.
我想在InstallValidate自定义操作之前立即重新安排RemoveExistingProducts自定义操作,以便先前的安装有机会在显示"正在使用的文件"对话框之前停止并删除该服务.我尝试重新安排操作,它似乎正常工作,没有任何不利的副作用(虽然日志仍然表明InstallValidate操作在RemoveExistingProducts操作之前执行),但我犹豫是否使用此解决方案,因为它违反了MSDN文档,我可能还没有看到可能产生的不利影响.
有没人试过这个?我能想到的唯一其他选择是让新安装停止旧安装的服务,但这是不可取的,因为它要求安装有关于它可以升级的所有旧安装的信息(停止此特定服务可能涉及更多而不只是简单地调用服务管理器来阻止它).