小编Ros*_*oss的帖子

Resharper:可能多次枚举IEnumerable

我正在使用新的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个部分枚举.

我错了吗?这里最好的方法是什么?

c# linq resharper optimization ienumerable

37
推荐指数
2
解决办法
2万
查看次数

我应该在我的WPF应用程序中手动强制垃圾收集吗?

我刚刚在WPF应用程序中整理了一些内存泄漏.为此,我使用了CLR分析器,以及在Windows任务管理器中查看进程统计信息.我的基本测试是确保当某个窗口关闭时,它仍然没有在内存中徘徊.

我对Windows开发有点新手,起初我很困惑,因为在一个简单的测试应用程序中,似乎无论如何,我的窗口在关闭后总是留在内存中.但我最终得出结论,这并不意味着存在内存泄漏,而只是简单地说它们还没有被垃圾收集.所以我不得不在我的主窗口中创建一个按钮,该按钮连接到一个事件处理程序,其中包含手动强制垃圾收集的代码.通过手动垃圾收集,我可以完成我的内存泄漏测试,我把它全部排序.

但它让我思考 - 是否需要手动强制垃圾收集?

当我打开和关闭窗口时,我很难看到我的应用程序的内存消耗量上升.当然,最终,垃圾收集会自动运行并且所有内容都会被整理出来.但在这些沉重的窗户关闭后,手动垃圾收集几乎是个好主意.但有什么意义吗?我觉得测试放在一边,我们不应该强制垃圾收集 - 只需让系统对其进行排序.

思想赞赏.

.net wpf garbage-collection memory-leaks

11
推荐指数
2
解决办法
9024
查看次数

将FixedDocument保存到XPS文件会导致内存泄漏

我创建了一个.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
  • 将这些代码行放在自己的线程中并手动关闭Dispatchers

仍然没有运气.

==========替代方案==========

通过使用http://msdn.microsoft.com/en-us/library/system.appdomain.aspx上的示例中显示的常规方法将上述代码隔离到自己的AppDomain中,内存泄漏不再影响我的服务(I说"不再影响",因为它仍然会发生,但是当卸载AppDomain时,所有泄露的资源都会被卸载).

我仍然希望看到一个真正的解决方案.

(在相关的说明中,对于那些感兴趣的人,使用单独的AppDomain导致PDFSharp组件中的内存泄漏,我用来将某些XPS文件转换为PDF文件.结果PDFSharp使用全局字体缓存,在正常情况下不会增长使用这些AppDomains后,缓存增长和增长.我编辑了PDFSharp源代码,使我能够手动清除FontDescriptorStock和FontDataStock,解决了这个问题.)

==========解决方案==========

请参阅下面的答案以获得最终解决方

wpf memory-leaks xpsdocument dispatcher fixeddocument

10
推荐指数
1
解决办法
5593
查看次数

在wpf中单击鼠标时如何获得较低zindex的控制?

我在同一画布上有多个控件,并且可能其中一个控件被另一个控件覆盖。它们都具有相同的 zIndex,但对于加载的顺序,有些向上,有些向下。我的问题是,如果 Acontrol 超过 Bcontrol,并且我单击它们,但只有 A 获得单击事件。我怎样才能让 B 也获得该事件?谢谢。

c# wpf controls z-index mouseevent

6
推荐指数
1
解决办法
2835
查看次数

Visual Studio 应用程序资源:“图标和清单”与“资源文件”问题

在 Visual Studio 2010 中,应用程序属性页面上有两个关于资源的选项:

  • 图标和清单
  • 资源文件

我一直在使用资源文件方法,因为这是实现我的构建要求之一的唯一方法。

但是,我最近注意到一个问题。

当您在 Windows 资源管理器中右键单击某个 EXE 文件,单击属性,然后转到详细信息选项卡时,它会显示几条信息(文件描述、产品名称、产品版本等)。

当我使用Icon 和 manifest构建我的应用程序时,我在 Visual Studio 中输入的所有程序集信息都用于填充这些信息字段。

但是当我使用Resource 文件构建时(正如我所做的那样),这些字段不会被填充。他们是空白的。

任何人都可以帮忙吗?

  • 有什么我做错了吗?是否应将此信息添加到我的自定义资源文件中?(我一直在寻找这种可能性,但没有运气)
  • 有没有其他方法来填充这些信息?
  • 我必须回到Icon 和 manifest方法吗?(在这种情况下,我将不得不重新考虑其他一些问题)

.net properties build manifest visual-studio-2010

5
推荐指数
1
解决办法
2831
查看次数

在不同的UI线程中打印DocumentViewer的内容

在我的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;amp; writer, PrintTicket&amp;amp; partialTrustPrintTicket, PrintQueue&amp;amp; partialTrustPrintQueue, Double&amp;amp; width, Double&amp;amp; height, String jobDescription)
at …
Run Code Online (Sandbox Code Playgroud)

printing wpf multithreading printdialog documentviewer

5
推荐指数
1
解决办法
5101
查看次数

有没有办法在我的WPF应用程序中使用ODTTF字体文件?

创建XPS文件时,它会将原始文档的字体作为ODTTF字体文件进行子集和模糊处理,并将它们捆绑在XPS文件中(这只是一个zip文件,因此可以轻松提取它们.)

我已经提取了其中一个ODTTF文件,并将其作为资源包含在我的WPF应用程序中.

我现在正在尝试将它用作TextBlock的FontFamily.我尝试了各种URI字符串来引用我的XAML中的ODTTF字体,但我根本无法使用它.(我可以获得常规的TTF文件,而不是ODTTF)

有没有办法做到这一点?我在一些谷歌搜索中找到了证据,人们正在设法做到这一点!

wpf resources fonts xps

5
推荐指数
1
解决办法
2274
查看次数

CryptographicException:使用 SHA-512 时“指定的算法无效”

在我的 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)

.net c# windows x509certificate2 sha512

5
推荐指数
1
解决办法
3109
查看次数

使用 JsonSerializer.DeserializeAsync 反序列化 JSON 没有使用我的 JsonConverter

服务器正在返回一个 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稍后使用它的地方来使其工作,但这是一个丑陋的解决方案。

有没有办法强制 …

.net c# json deserialization system.text.json

5
推荐指数
1
解决办法
4973
查看次数

我的WPF应用程序中的SaveFileDialog异常

我的一位客户在保存文件时遇到了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%确定发生了什么.

wpf special-folders argumentexception savefiledialog

4
推荐指数
2
解决办法
2040
查看次数

简单的更改会导致SQL查询执行时间大幅增加

我在我的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)

sql t-sql sql-server execution-time sql-execution-plan

2
推荐指数
1
解决办法
818
查看次数

EmailComposeTask/SmsComposeTask丢失了我的应用状态

我正在开发我的第一个Windows Phone 7应用程序.我还没有访问实际的设备,所以我依赖SDK附带的模拟器.

在我的应用程序中,我使用EmailComposeTaskSmsComposeTask所需的地方.在模拟器中调试我的应用程序时,我单击一个按钮来运行其中一个任务,它可以工作.但是,当我按下后退按钮退出任务并返回我的应用程序时,应用程序状态丢失了 - 就好像我重新启动它一样.

但是,在它变得奇怪的地方,有时候这种情况不会发生.我不止一次从其中一个任务回来,发现我的应用程序状态确切地说我离开了它.

所以,我的问题:

  1. 这只是模拟器的错误吗?
  2. 如果没有,为什么不一致,在调用电子邮件或短信任务之前,我应该如何"保存"我的应用状态?

谢谢.

state windows-phone-7

0
推荐指数
1
解决办法
500
查看次数