小编sco*_*obi的帖子

如何使WPF样式可继承到派生类?

在我们的WPF应用程序中,我们拥有全球风格TargetType={x:Type ContextMenu}.我创建了一个派生自ContextMenu的MyContextMenu,但现在默认样式不适用.

如何告诉WPF我希望MyContextMenu从ContextMenu继承默认样式?希望我可以从我的控件本身(通过静态ctor元数据覆盖或其他什么?)中做到这一点,而不必在任何xaml中乱七八糟.

c# wpf xaml

18
推荐指数
1
解决办法
4095
查看次数

DynamicResource而不是StaticResource是否会产生显着的性能成本?

我们的设计师使用Blend来设计我们的WPF应用程序.当他选择属性的本地资源时,Blend会将它们应用为{DynamicResource}而不是a {StaticResource}.我的猜测是Blend这样做是因为它使应用程序能够在运行时重新设置主题而无需重新启动它.

我的问题是:这个额外的查找是否有显着的性能成本?我们是否应该要求设计人员返回并手动将这些动态更改为静态?

这是一个很好的SO问题,解释了类型之间的区别:WPF中StaticResource和DynamicResource之间的区别是什么?

wpf performance resources dynamicresource staticresource

16
推荐指数
2
解决办法
5286
查看次数

哪个更好,Enumerable.Empty <T>还是new [0]?

这些都是一样的:

IEnumerable<string> i;
i = Enumerable.Empty<string>();
i = new string[0];
Run Code Online (Sandbox Code Playgroud)

那么,使用哪个?

我认为第一个更清楚地传达意图,但它更大,更嘈杂,更不用说调试器中的丑陋.如果我正在阅读Reflector,那么第二个在内存和CPU方面也更有效率.

我倾向于new type[0],但想知道你们都在想什么.

c#

16
推荐指数
3
解决办法
2637
查看次数

如何在4.0环境中加速Powershell的启动?

我正在考虑在Perforce服务器上使用Powershell脚本作为触发器.不幸的是,即使在我们的快速硬件上,Powershell启动仍需要2秒钟.现在,除非您考虑到200个用户不断地敲击服务器,并且触发器可能(取决于条件)在运行时导致表锁定,停止其他相关请求,否则这似乎不是很多时间.

我正在寻找减少Powershell启动时间的方法.我在Google上找到的东西:

  • 减少个人资料.这是默认安装,没有配置文件自定义,没有PSCX等,所以这没有帮助.
  • 在Posh二进制文件上运行NGEN.对于V1问题,这是一个老建议.我们在V2.
  • 保持温暖.初始的Posh启动很慢但后来的初创公司很快.对我们也没有帮助.在服务器上,热启动是2秒,并且经常请求保持温暖.
  • 不要将Powershell用于此目的.好吧,我希望避免那个"解决方案"......

有没有人有任何其他建议减少启动时间?我不希望像cmd.exe或.NET命令行应用程序那样快速启动,但是如果我能得到这个.5秒,我想我们会没事的.不可能?

更新 - 事实证明这是一个4.0问题.如果我按照另一个SO问题中的描述添加配置文件,启动需要2秒.如果我将其保留为默认值,那么启动时间不到四分之一秒.

然后我想..也许这是4.0 GAC问题.所以我在PowerShell博客上运行了脚本,但它说所有的程序集都已经完成了.我确信它确实也使用了4.0 ngen.

所以我有两个选择:

  • 弄清楚为什么4.0比3.5贵得多.
  • 切换到我不需要它的3.5框架,我确实需要性能.

我想先解决第一个但不知道从哪里开始.有人可以帮忙吗?

powershell performance

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

如何使用.NET try/catch链来决定生成一个minidump

我们遇到了混乱任务与我们的顶级崩溃处理程序,并试图找到一个解决方法.我希望有人有一些想法.

我们的工具有一个顶级崩溃处理程序(来自AppDomain的UnhandledException事件),我们用它来用minidump提交bug报告.它运作得很好.不幸的是,任务在这方面引起了轰动.

我们刚刚开始使用4.0任务,并在Task动作执行代码内部发现了一个try/catch,它抓取异常并存储它以传递任务链.不幸的是,存在catch (Exception)放松堆栈,当我们创建minidump时,调用站点丢失了.这意味着我们在崩溃时没有任何局部变量,或者它们已被收集,等等.

异常过滤器似乎是这项工作的正确工具.我们可以通过扩展方法将一些Task动作代码包装在过滤器中,并且在抛出异常时调用我们的崩溃处理程序代码来报告minidump的错误.但是,我们不希望在每个异常上执行此操作,因为在我们自己的代码中可能存在忽略特定异常的try-catch.如果catchin Task要处理它,我们只想做崩溃报告.

有没有办法走向try/catch处理程序链?我想如果我能做到这一点,我可以向上走,寻找捕获,直到命中任务,然后触发崩溃处理程序,如果是真的.

(这似乎是一个很长的镜头,但我想我还是会问.)

或者,如果有人有任何更好的想法,我很乐意听到他们!

UPDATE

我创建了一个小示例程序来演示这个问题.我道歉,我试图让它尽可能短,但它仍然很大.:/

在下面的示例中,您可以#define USETASK或#define USEWORKITEM(或没有)测试三个选项中的一个.

在非异步情况和USEWORKITEM情况下,生成的minidump是在调用站点构建的,正是我们需要的.我可以在VS中加载它(在一些浏览后找到正确的线程),我看到我在呼叫站点拍摄了快照.真棒.

在USETASK案例中,快照从终结器线程中获取,该线程正在清理任务.抛出异常后很长时间,因此在此时抓取一个minidump是没用的.我可以对任务执行Wait()以更快地处理异常,或者我可以直接访问它的Exception,或者我可以在TestCrash本身的包装器中创建minidump,但所有这些仍然有相同的问题:这太晚了,因为堆栈已经解开了一个或另一个.

请注意,我故意在TestCrash中放置一个try/catch来演示我们希望如何正常处理某些异常,以及其他异常被捕获.USEWORKITEM和非异步案例正是我们所需要的.任务几乎做得对!如果我能以某种方式使用异常过滤器让我走向try/catch链(实际上没有展开),直到我点击Task内部的catch,我可以自己做必要的测试,看看是否需要运行崩溃处理程序或不.因此,我原来的问题.

这是样本.

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        AppDomain.CurrentDomain.UnhandledException += (_, __) =>
            {
                using (var stream = File.Create(@"c:\temp\test.dmp"))
                {
                    var process = Process.GetCurrentProcess();
                    MiniDumpWriteDump(
                        process.Handle,
                        process.Id,
                        stream.SafeFileHandle.DangerousGetHandle(),
                        MiniDumpType.MiniDumpWithFullMemory,
                        IntPtr.Zero,
                        IntPtr.Zero,
                        IntPtr.Zero);
                }
                Process.GetCurrentProcess().Kill();
            };
        TaskScheduler.UnobservedTaskException += …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library

15
推荐指数
1
解决办法
1696
查看次数

如何防止Vista要求提升patch.exe?

[对不起,这不是一个直接的编程问题.但我最近切换到一台新的Vista机器,我保持启用UAC(请不要告诉我禁用它,它不是一个选项).

每次运行gnu的patch.exe时,我都会从Vista获得一个提升对话框.如果我将patch.exe重命名为foo.exe它不会这样做,所以我认为这是Vista的"启发式"之一.

有谁知道如何禁用它?这让我疯狂,谷歌没有帮助.

或者我应该为patch.exe添加一个清单,告诉系统不要试图提升这个?这会起作用,如果是这样,你怎么做出这样的表现?

非常感谢,到目前为止,我一直在墙上撞了一个小时.

uac patch windows-vista

14
推荐指数
2
解决办法
2864
查看次数

C#中的lambda如何绑定到foreach中的枚举器?

我刚刚遇到了最意想不到的行为.我确信这有一个很好的理由.有人可以帮忙解释一下吗?

考虑以下代码:

var nums = new int[] { 1, 2, 3, 4 };
var actions = new List<Func<int>>();

foreach (var num in nums)
{
    actions.Add(() => num);
}

foreach (var num in nums)
{
    var x = num;
    actions.Add(() => x);
}

foreach (var action in actions)
{
    Debug.Write(action() + " ");
}
Run Code Online (Sandbox Code Playgroud)

输出对我来说有点意外:

4 4 4 4 1 2 3 4 
Run Code Online (Sandbox Code Playgroud)

显然,lambda是如何引用枚举器的.在foreach的第一个版本中,'num'实际上是绑定到'Current',而不是它返回的结果?

c# foreach lambda

13
推荐指数
1
解决办法
1829
查看次数

如何在XAML中设置ad:DesignInstance的属性?

我正在使用4.0系列WPF工具的新d:DesignInstance功能.效果很好!

我遇到的唯一问题是:如何在实例上设置属性?鉴于这样的事情:

<Grid d:DataContext="{d:DesignInstance plugin:SamplePendingChangesViewModel, IsDesignTimeCreatable=True}"/>
Run Code Online (Sandbox Code Playgroud)

如何在viewmodel上设置属性,除了在默认ctor中设置属性还是通过其他对象初始化程序进行路由?

我试了一下但是VS在编译时出错"d:找不到DataContext":

<Grid>
    <d:DataContext>
        <d:DesignInstance IsDesignTimeCreatable="True">
            <plugin:SamplePendingChangesViewModel ActiveTagIndex="2"/>
        </d:DesignInstance>
    </d:DataContext>
Run Code Online (Sandbox Code Playgroud)

目前我将回到使用资源和'd:DataContext = {StaticResource SampleData}',我可以在其中设置资源中的属性.

有没有办法通过广告来实现:DesignInstance?

wpf xaml

13
推荐指数
1
解决办法
8209
查看次数

为什么可以在没有编译器错误的情况下比较无关的c#接口引用

我最近惊讶地发现编译器显然对比较接口引用并不严格,并且想知道为什么它以这种方式工作.

考虑以下代码:

class Program
{
    interface I1 {}
    interface I2 {}
    class C1 : I1 {}
    class C2 : I2 {}

    static void Main(string[] args)
    {
        C1 c1 = new C1();
        C2 c2 = new C2();

        I1 i1 = c1;
        I2 i2 = c2;

        bool x = c1 == c2;
        bool y = i1 == i2;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器说我无法比较c1 == c2,接下来.这些类型完全不相关.然而,它确实允许我进行比较i1 == i2.我希望它在编译时失败时会出错,但我很惊讶地发现你可以将任何接口与任何其他接口进行比较,编译器永远不会抱怨.我可以比较,例如(I1)null == (IDisposable)null,没有问题.

接口不是对象吗?它们是一种特殊的参考类型吗?我的期望是a ==会导致直接引用比较或调用具体类的虚拟等于.

我错过了什么?

c# interface

13
推荐指数
2
解决办法
773
查看次数

在C#中编写批处理脚本的好方法是什么?

我想用C#编写简单的脚本.我通常会使用.bat或4NT .btm文件.复制文件,解析文本,询问用户输入等.相当简单,但在批处理文件中执行此操作非常困难(例如,没有例外).

我熟悉像AxScript这样的命令行"脚本"包装器,这样我就可以使用它.我缺少的是简单的文件操作框架.我希望能够做cd(".."),copy(srcFile,destFile)类型的功能.

我试过的工具:

  • NANT,我们在构建过程中使用它.不是一个好的脚本工具.疯狂冗长的XML语法并添加一个简单的函数,您必须编写扩展程序集.不能内联.

  • 电源外壳.看起来很棒,但我只是无法切换到我的主要shell.与4NT有太多不同.无论我做什么都需要从普通的命令提示符运行而不需要特殊的shell来运行它.PowerShell可以用作脚本执行程序吗?

  • 的Perl/Python的/红宝石.真的讨厌学习一种全新的语言和框架来进行批处理文件操作.无法投入我需要的时间来做这件事.另外,我们的工具链是99%的.NET商店,我真的想利用我们现有的经验和代码库.

是否有框架试图解决您使用的"在C#中创建批处理文件"的问题?

我希望C#/ .NET的强大功能具有典型cmd.exe shell语言的立即模式类型功能.我一个人想要这样的东西吗?

c# shell powershell command-line batch-file

12
推荐指数
1
解决办法
1436
查看次数