我正在使用新的Resharper版本6.在我的代码中的几个地方它强调了一些文本,并警告我可能有一个可能的多个IEnumerable枚举.
我理解这意味着什么,并在适当的时候采纳了建议,但在某些情况下,我不确定这实际上是一个大问题.
如下面的代码所示:
var properties = Context.ObjectStateManager.GetObjectStateEntry(this).GetModifiedProperties();
if (properties.Contains("Property1") || properties.Contains("Property2") || properties.Contains("Property3")) {
...
}
Run Code Online (Sandbox Code Playgroud)
它强调properties了第二行的每一个提及,警告我多次枚举这个IEnumerable.
如果我添加.ToList()到第1行的末尾(properties从a IEnumerable<string>转到a List<string>),警告就会消失.
但可以肯定的是,如果我将它转换为List,那么它将枚举整个IEnumerable以首先构建List,然后根据需要枚举List以查找属性(即1个完整枚举和3个部分枚举) ).而在我的原始代码中,它只执行3个部分枚举.
我错了吗?这里最好的方法是什么?
我刚刚在WPF应用程序中整理了一些内存泄漏.为此,我使用了CLR分析器,以及在Windows任务管理器中查看进程统计信息.我的基本测试是确保当某个窗口关闭时,它仍然没有在内存中徘徊.
我对Windows开发有点新手,起初我很困惑,因为在一个简单的测试应用程序中,似乎无论如何,我的窗口在关闭后总是留在内存中.但我最终得出结论,这并不意味着存在内存泄漏,而只是简单地说它们还没有被垃圾收集.所以我不得不在我的主窗口中创建一个按钮,该按钮连接到一个事件处理程序,其中包含手动强制垃圾收集的代码.通过手动垃圾收集,我可以完成我的内存泄漏测试,我把它全部排序.
但它让我思考 - 是否需要手动强制垃圾收集?
当我打开和关闭窗口时,我很难看到我的应用程序的内存消耗量上升.当然,最终,垃圾收集会自动运行并且所有内容都会被整理出来.但在这些沉重的窗户关闭后,手动垃圾收集几乎是个好主意.但有什么意义吗?我觉得测试放在一边,我们不应该强制垃圾收集 - 只需让系统对其进行排序.
思想赞赏.
我创建了一个.NET Windows服务,它执行某些操作并生成报告.这些报告是我保存在某个目录中的XPS文档.
熟悉WPF,我选择创建报告的方法是实例化a System.Windows.Documents.FixedDocument,FixedPage根据需要添加包含内容的对象.
我的问题是服务内存使用量随着时间的推移而上升和上升.
起初,我严格检查了我的代码,确保所有一次性物品都被丢弃等,以及其他明显的内存泄漏候选者,但仍然存在问题.然后我使用CLR Profiler详细查看服务的内存使用情况.
我发现,随着服务生成这些FixedDocument报告,并将其保存为XPS文件,所有相关的各种UI元素FixedDocument的对象(Dispatcher,FixedPage,UIElementCollection,Visual是住在存储器等).
当我在WPF应用程序中执行相同操作时似乎不会发生这种情况,因此我的预感是它与在WPF应用程序之外使用的WPF UI Dispatcher模型有关.
FixedDocument在像这样的服务中(或者一般在WPF应用程序之外)使用它们时,如何"处置"我的对象?
========编辑=========
好吧,我发现我的内存泄漏与创建/填充FixedDocument无关.如果我这样做,但实际上并没有将其作为XPS保存到磁盘,则不会发生内存泄漏.所以,我的问题必须是保存为XPS文件.
这是我的代码:
var paginator = myFixedDocument.DocumentPaginator;
var xpsDocument = new XpsDocument(filePath, FileAccess.Write);
var documentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
documentWriter.Write(paginator);
xpsDocument.Close();
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
UpdateLayout()每一页myFixedDocument(如下面的答案所示) - 我也试过myFixedDocument直接传入Write() ie而不是paginator仍然没有运气.
==========替代方案==========
通过使用http://msdn.microsoft.com/en-us/library/system.appdomain.aspx上的示例中显示的常规方法将上述代码隔离到自己的AppDomain中,内存泄漏不再影响我的服务(I说"不再影响",因为它仍然会发生,但是当卸载AppDomain时,所有泄露的资源都会被卸载).
我仍然希望看到一个真正的解决方案.
(在相关的说明中,对于那些感兴趣的人,使用单独的AppDomain导致PDFSharp组件中的内存泄漏,我用来将某些XPS文件转换为PDF文件.结果PDFSharp使用全局字体缓存,在正常情况下不会增长使用这些AppDomains后,缓存增长和增长.我编辑了PDFSharp源代码,使我能够手动清除FontDescriptorStock和FontDataStock,解决了这个问题.)
==========解决方案==========
请参阅下面的答案以获得最终解决方
我在同一画布上有多个控件,并且可能其中一个控件被另一个控件覆盖。它们都具有相同的 zIndex,但对于加载的顺序,有些向上,有些向下。我的问题是,如果 Acontrol 超过 Bcontrol,并且我单击它们,但只有 A 获得单击事件。我怎样才能让 B 也获得该事件?谢谢。
在 Visual Studio 2010 中,应用程序属性页面上有两个关于资源的选项:
我一直在使用资源文件方法,因为这是实现我的构建要求之一的唯一方法。
但是,我最近注意到一个问题。
当您在 Windows 资源管理器中右键单击某个 EXE 文件,单击属性,然后转到详细信息选项卡时,它会显示几条信息(文件描述、产品名称、产品版本等)。
当我使用Icon 和 manifest构建我的应用程序时,我在 Visual Studio 中输入的所有程序集信息都用于填充这些信息字段。
但是当我使用Resource 文件构建时(正如我所做的那样),这些字段不会被填充。他们是空白的。
任何人都可以帮忙吗?
在我的WPF应用程序中,我特别Window包含其中一个控件DocumentViewer.
打开并加载此窗口时,它会动态构建FixedDocument带有进度指示器的窗口,然后将其显示在DocumentViewer.它工作,并为了改善用户体验,我在自己的线程中运行此窗口,以便在构建文档时主应用程序窗口仍然响应.
基于此网页上的提示,我在一个新的线程中打开我的窗口,如下所示:
public void ShowDocumentViewerWindow(params object[] data) {
var thread = new Thread(() => {
var window = new MyDocumentViewerWindow(new MyObject(data));
window.Closed += (s, a) => window.Dispatcher.InvokeShutdown();
window.Show();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我对这个设置很满意,但我刚遇到了一个问题.
MyDocumentViewerWindow 包含一个打印按钮,它引用内置的Print命令,以DocumentViewer为目标:
<Button Command="Print" CommandTarget="{Binding ElementName=MyDocumentViewer}">Print</Button>
Run Code Online (Sandbox Code Playgroud)
在我把窗口放在自己的线程之前,这很好用.但现在,当我点击它时,应用程序崩溃了.Visual Studio 2010将上面代码中的以下行突出显示为崩溃位置,并显示消息' 调用线程无法访问此对象,因为另一个线程拥有它.":
System.Windows.Threading.Dispatcher.Run();
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪如下所示:
at System.Windows.Threading.Dispatcher.VerifyAccess()
at MS.Internal.Printing.Win32PrintDialog.ShowDialog()
at System.Windows.Controls.PrintDialog.ShowDialog()
at System.Printing.PrintQueue.GatherDataFromPrintDialog(PrintDialog printDialog, XpsDocumentWriter&amp; writer, PrintTicket&amp; partialTrustPrintTicket, PrintQueue&amp; partialTrustPrintQueue, Double&amp; width, Double&amp; height, String jobDescription)
at …Run Code Online (Sandbox Code Playgroud) 创建XPS文件时,它会将原始文档的字体作为ODTTF字体文件进行子集和模糊处理,并将它们捆绑在XPS文件中(这只是一个zip文件,因此可以轻松提取它们.)
我已经提取了其中一个ODTTF文件,并将其作为资源包含在我的WPF应用程序中.
我现在正在尝试将它用作TextBlock的FontFamily.我尝试了各种URI字符串来引用我的XAML中的ODTTF字体,但我根本无法使用它.(我可以获得常规的TTF文件,而不是ODTTF)
有没有办法做到这一点?我在一些谷歌搜索中找到了证据,人们正在设法做到这一点!
在我的 WPF 应用程序 (.NET 4.6) 中,我需要使用 P12 证书文件来使用 SHA-512 算法对字符串进行签名(以包含在 Web 请求的标头中)。我这样做如下:
using (var rsa = myX509Certificate2.GetRSAPrivateKey()) {
myBytes = rsa.SignData(
Encoding.UTF8.GetBytes(stringToSign),
HashAlgorithmName.SHA512,
RSASignaturePadding.Pkcs1
);
}
Run Code Online (Sandbox Code Playgroud)
这在测试中适用于几乎所有客户,但奇怪的客户会遇到以下异常:
System.Security.Cryptography.CryptographicException: Invalid algorithm specified.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash, Int32 cbHash, ObjectHandleOnStack retSignature)
at System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash)
at System.Security.Cryptography.RSACryptoServiceProvider.SignHash(Byte[] rgbHash, Int32 calgHash)
at System.Security.Cryptography.RSACryptoServiceProvider.SignHash(Byte[] hash, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding)
at System.Security.Cryptography.RSA.SignData(Byte[] data, Int32 offset, Int32 count, HashAlgorithmName …Run Code Online (Sandbox Code Playgroud) 服务器正在返回一个 JSON 字符串值,它是一个 URL 查询字符串:
{
"parameters": "key1=value1&key2=value2"
}
Run Code Online (Sandbox Code Playgroud)
我设置了一个属性来接收它,并将其转换Dictionary为反序列化过程的一部分:
具有JsonConverter属性的属性:
[JsonConverter(typeof(QueryStringToDictionaryJsonConverter))]
public Dictionary<string, string> Parameters { get; set; }
Run Code Online (Sandbox Code Playgroud)
转换器:
public class QueryStringToDictionaryJsonConverter : JsonConverter<Dictionary<string, string>> {
public override Dictionary<string, string> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var queryString = reader.GetString();
if (string.IsNullOrEmpty(queryString)) return null;
return QueryHelpers.ParseQuery(queryString).ToDictionary(e => e.Key, e => string.Join(",", e.Value.ToArray()));
}
...
}
Run Code Online (Sandbox Code Playgroud)
这应该有效。
但它甚至没有到达我的转换器。
据我所知,JsonSerializer.DeserializeAsync<T>(myJson)看到属性的类型是 a Dictionary,因此它尝试自行解析该值,但失败了(结果异常是“无效转换”,因为它试图GetEnumerable()等)。我的转换器中的断点甚至从未被击中。
我可以通过将属性设置为 anobject然后将其转换为Dictionary稍后使用它的地方来使其工作,但这是一个丑陋的解决方案。
有没有办法强制 …
我的一位客户在保存文件时遇到了WPF应用程序崩溃的问题.
我的保存文件代码是:
var saveFileDialog = new SaveFileDialog {
InitialDirectory = string.Concat(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"\MyApp"),
FileName = "MyFile",
OverwritePrompt = true,
AddExtension = true
};
if (saveFileDialog.ShowDialog() == true) {
...
}
Run Code Online (Sandbox Code Playgroud)
以下是他们获得的例外情况:
Value does not fall within the expected range.
A System.ArgumentException occurred
at MS.Internal.Interop.HRESULT.ThrowIfFailed(String message)
at MS.Internal.AppModel.ShellUtil.GetShellItemForPath(String path)
at Microsoft.Win32.FileDialog.PrepareVistaDialog(IFileDialog dialog)
at Microsoft.Win32.FileDialog.RunVistaDialog(IntPtr hwndOwner)
at Microsoft.Win32.FileDialog.RunDialog(IntPtr hwndOwner)
at Microsoft.Win32.CommonDialog.ShowDialog()
Run Code Online (Sandbox Code Playgroud)
(ShowDialog最后一行中的位置是指我在上面的代码中进行的调用.)
所以我的预感是,在我的客户的情况下,对Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)的调用返回了一些SaveFileDialog不喜欢的内容InitialDirectory.我在Web搜索中找到(并验证)在传递InitialDirectorySaveFileDialog 的相对路径时发生此错误.是否有可能Environment.SpecialFolder.MyDocuments作为相对路径返回?如果没有,是否有人知道另一种可能无效的格式?某个SpecialFolder.MyDocuments网络路径可能是原因吗?还有其他想法吗?
我没有直接访问我客户的机器,他们不是特别精通技术,所以不可能100%确定发生了什么.
我在我的Microsoft SQL Server(2012 Express)数据库上运行以下SQL查询,它工作正常,在不到一秒的时间内执行:
SELECT
StringValue, COUNT(StringValue)
FROM Attributes
WHERE
Name = 'Windows OS Version'
AND StringValue IS NOT NULL
AND ProductAssociation IN (
SELECT ID
FROM ProductAssociations
WHERE ProductCode = 'MyProductCode'
)
GROUP BY StringValue
Run Code Online (Sandbox Code Playgroud)
我在内部查询中添加了一个过滤器,它继续正常工作,返回的结果略少(如预期的那样),并且在不到一秒的时间内执行.
SELECT
StringValue, COUNT(StringValue)
FROM Attributes
WHERE
Name = 'Windows OS Version'
AND StringValue IS NOT NULL
AND ProductAssociation IN (
SELECT ID
FROM ProductAssociations
WHERE ProductCode = 'MyProductCode'
AND ID IN (
SELECT A2.ProductAssociation
FROM Attributes A2
WHERE A2.Name = 'Is test' AND …Run Code Online (Sandbox Code Playgroud) 我正在开发我的第一个Windows Phone 7应用程序.我还没有访问实际的设备,所以我依赖SDK附带的模拟器.
在我的应用程序中,我使用EmailComposeTask和SmsComposeTask所需的地方.在模拟器中调试我的应用程序时,我单击一个按钮来运行其中一个任务,它可以工作.但是,当我按下后退按钮退出任务并返回我的应用程序时,应用程序状态丢失了 - 就好像我重新启动它一样.
但是,在它变得奇怪的地方,有时候这种情况不会发生.我不止一次从其中一个任务回来,发现我的应用程序状态确切地说我离开了它.
所以,我的问题:
谢谢.
wpf ×6
.net ×4
c# ×4
memory-leaks ×2
build ×1
controls ×1
dispatcher ×1
fonts ×1
ienumerable ×1
json ×1
linq ×1
manifest ×1
mouseevent ×1
optimization ×1
printdialog ×1
printing ×1
properties ×1
resharper ×1
resources ×1
sha512 ×1
sql ×1
sql-server ×1
state ×1
t-sql ×1
windows ×1
xps ×1
xpsdocument ×1
z-index ×1