小编Dav*_*ave的帖子

需要击败GC并且一旦超出范围就将对象销毁

我需要使用Mutex保护几段代码.问题是代码看起来像这样:

lock(mylockobject) {
  if(!foo())
    throw new MyException("foo failed");
  if(!bar())
    throw new MyException("bar failed");
}
Run Code Online (Sandbox Code Playgroud)

使用锁,它可以按照我的意愿工作,但现在我需要使用互斥锁.这里显而易见的问题是,如果我获取互斥锁并且foo()或bar()失败,我将不得不在抛出每个异常之前释放互斥锁.

在C++中,我将利用在堆栈上创建的对象的范围,并将互斥锁定在对象的构造函数中,然后在析构函数中释放它.使用.NET的垃圾收集,我认为这不会起作用.我写了一个测试应用程序,并确认如果我做这样的事情:

public class AutoMutex
{
  private Mutex _mutex;
  public AutoMutex(Mutex mutex)
  {
     _mutex = mutex;
     _mutex.WaitOne();
  }

  ~AutoMutex()
  {
    _mutex.ReleaseMutex();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后有这样的代码:

// some code here...
Mutex my_mutex = new Mutex(false, "MyMutex");
{ // scoping like I would do in C++
  AutoMutex test = new AutoMutex(my_mutex);
  test = null;
}
Run Code Online (Sandbox Code Playgroud)

析构函数(终结器?)直到很久才被调用.

谷歌还没有指出我正确的方向,但我还在努力......请让我知道如何解决这个小问题,如果可能的话.

c# garbage-collection locking

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

使用NUnit进行MEF和单元测试

几个星期前,我跳过了MEF(ComponentModel)的潮流,现在我正在使用它来插入很多插件和共享库.总的来说,除了我经常犯的错误之外,它一直很棒,这导致令人沮丧的调试会话.

无论如何,我的应用程序运行良好,但我的MEF相关代码更改导致我的自动构建失败.我的大多数单元测试都失败了,因为我测试的模块依赖于需要由MEF加载的其他模块.我通过绕过MEF并直接实例化这些对象来解决这些问题.

换句话说,通过MEF,我会有类似的东西

[Import]
public ICandyInterface ci { get; set; }
Run Code Online (Sandbox Code Playgroud)

[Export(typeof(ICandyInterface))]
public class MyCandy : ICandyInterface
{
    [ImportingConstructor]
    public MyCandy( [Import("name_param")] string name) {}
    ...
}
Run Code Online (Sandbox Code Playgroud)

但在我的单元测试中,我会使用

CandyInterface MyCandy = new CandyInterface( "Godiva");
Run Code Online (Sandbox Code Playgroud)

另外,CandyInterface需要连接到数据库,我通过将测试数据库添加到我的单元测试文件夹来解决这个问题,我让NUnit使用它来进行所有测试.

好的,以下是我对这种情况的疑问:

  1. 这是一种做坏事的坏方法吗?
  2. 你会建议在[SetUp]中编写部件吗?
  3. 我还没有学会如何在单元测试中使用模拟 - 这是一个很好的例子,我可能想要模拟底层数据库连接(不知何故)只返回虚拟数据而不是真正需要数据库?
  4. 如果您之前遇到过这样的事情,您能否提供您的经验和解决问题的方式?(或者这应该进入社区维基?)

unit-testing mef system.componentmodel

4
推荐指数
1
解决办法
6457
查看次数

使用WiX安装的应用程序将无法正常运行,除非以管理员身份运行

关于SO的现有问题可能正是我所需要的,但没有得到回答.;)

我在我的WiX安装程序的初始测试中没有意识到这一点,但我的应用程序在安装后在Windows 7上无法正常工作.各种程序集需要在我的安装文件夹中读/写文件,但在运行时拒绝访问.

如果我然后以管理员身份运行应用程序,它将完美运行.我也可以手动更改应用程序的属性,以便它始终以管理员身份运行.但是,我不希望用户每次都必须单击是以UAC提示.

我没有得到的部分是,如果我从源代码文件夹运行我的可执行文件,我不必以管理员身份运行它,它完美地工作.

任何人都可以解释原因:1.我的可执行文件,从我的bin/Debug文件夹运行时,不需要以管理员身份运行并且有效吗?2.如何让WiX安装可执行文件,以便它的工作方式完全相同?(即不需要右键单击+以管理员身份运行)

谢谢!

wpf installer windows-installer wix windows-7

4
推荐指数
1
解决办法
1975
查看次数

使用向下箭头键滚动的WPF DataGrid行为很奇怪

我有一段时间以来一直使用的WPF DataGrid,效果很好.与其他海报不同,我还没有滚动条或鼠标滚轮的问题.我已CTRLEND编程到DataGrid的末尾,然后它跟踪最近添加的项目.我可以DataGridup键向上滚动内容.

但是,我对down键的行为非常奇怪!如果我从我的顶部开始DataGrid并按住down键,它会滚动一点,然后最终在两个相邻行之间来回反弹.如果我pgdn,它将向下滚动更多,然后跳回到前两行的最顶部,它将跳转到之间,然后向下滚动到我要去的点pgdn.如果我再向下翻页,该down键将滚动到结尾.如果我走到顶部DataGrid并重新开始,我会一遍又一遍地得到完全相同的行为.

我还没有找到解决这个问题的帖子,而且我在DataGrid文档中没有看到任何有用的内容.

它只是一个三列DataGrid,每列显示TextBlocks.任何人都可以解释为什么这种滚动模式有问题吗?这是XAML:

<DataGrid ItemsSource="{Binding MainLog}" AutoGenerateColumns="False" 
     Name="log_datagrid" SelectedCellsChanged="log_datagrid_SelectedCellsChanged"   
     KeyUp="datagrid_KeyUp" LoadingRow="log_datagrid_LoadingRow">
    <DataGrid.Columns>
        <!-- timestamp -->
        <DataGridTemplateColumn Header="Timestamp">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Timestamp}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- level -->
        <DataGridTemplateColumn Header="Level">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Level}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- error message -->
        <DataGridTemplateColumn Header="Message">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Message}" …
Run Code Online (Sandbox Code Playgroud)

c# wpf datagrid .net-4.0 wpfdatagrid

4
推荐指数
1
解决办法
1676
查看次数

一旦我将NUnit添加到混合中,TeamCity就停止了工作

我正在努力让我们的构建服务器继续努力.我目前正在Windows XP虚拟机中运行测试,并已安装TeamCity v5.0.3,build 10821.我正在使用NUnit v2.5.3.

我完成了TeamCity的初始设置,没有任何问题,只要我使用sln2008构建运行器,使整个过程几乎无脑.这种方式非常好,并且非常令人满意地看到您的第一个成功的自动构建.

现在是时候把它提升一个档次了,我想让NUnit工作.我将NUnit 2.5.3程序集保存在SVN的外部libs文件夹中,因此我将其检查到了测试系统.我从构建运行器选项中选择了NUnit 2.5.3,正如在线说明所推荐的那样.但是当我构建时,我收到以下错误:

Window1.xaml.cs(14,7): error CS0246: The type or namespace name ‘NUnit’ could not be found (are you missing a using directive or an assembly reference?) 
Window1.xaml.cs(28,10): error CS0246: The type or namespace name ‘Test’ could not be found (are you missing a using directive or an assembly reference?) 
Window1.xaml.cs(28,10): error CS0246: The type or namespace name ‘TestAttribute’ could not be found (are you missing a using directive or an assembly reference?)
Run Code Online (Sandbox Code Playgroud)

在IDE中,一切都很好.

通过查找博客文章和提交评论,我得到了一些建议并确认了以下内容: …

teamcity continuous-integration nunit unit-testing visual-studio-2008

3
推荐指数
1
解决办法
2134
查看次数

FxCop讨厌我对MVVM的使用

我刚刚开始使用FxCop来查看我的代码对其完整规则的影响有多么糟糕.我开始使用"Breaking"规则,我遇到的第一个是CA2227,它基本上说你应该只读取一个collection属性的setter,这样你就不会意外地改变收集数据.

由于我使用MVVM,我发现使用带有get/set属性的ObservableCollection非常方便,因为它使我的GUI更新在代码隐藏中变得简单和简洁.但是,我也可以看到FxCop在抱怨什么.

我遇到的另一种情况是使用WF,我需要在创建工作流时设置参数,我不得不围绕我正在使用的集合编写一个包装类,以避免出现这种特殊的错误消息.

例如,这是我在readonly创建属性时获得的示例运行时错误消息:

The activity 'MyWorkflow' has no public writable property named 'MyCollectionOfStuff'
Run Code Online (Sandbox Code Playgroud)

你对此有何看法?我可以忽略这个特定的错误,但这可能并不好,因为我可以想象在MVVM不适用的代码中的其他地方违反了这个规则(例如,仅建模代码).我我也可以通过操作底层集合的方法将它从属性更改为类,然后从setter方法引发必要的通知.我有点困惑......任何人都可以对此有所了解吗?

c# data-binding fxcop observablecollection mvvm

3
推荐指数
1
解决办法
696
查看次数

MEF的多次出口确实有些令人发指的东西 - 为什么,为什么允许它?

我有一个有趣的情况,我需要做这样的事情:

[Export[typeof(ICandy1)]
[Export[typeof(ICandy2)]
public class Candy : ICandy2 { ... }
Run Code Online (Sandbox Code Playgroud)

哪里

public interface ICandy1 { ... }
public interface ICandy2 : ICandy1 { ... }
Run Code Online (Sandbox Code Playgroud)

我无法在任何地方找到任何关于使用多个[导出]属性的帖子,所以我想,到底是什么,不妨尝试一下.

乍一看,它实际上似乎有效.我有几个方法调用Candy实例的两个接口,它很好.

但是,当我开始测试应用程序时,我看到行为不正确,在查看"输出"窗口时,我看到我收到了大量的COMExceptions.我无法追踪它们的来源,但它们总是在工人线程正在睡觉时发生.我认为它必须来自主线程,然后,但根本不知道如何调试它.GUI中没有任何内容,我禁用了我的DispatchTimers以防万一 - 同样的事情.

踩过代码时,比COMExceptions更奇怪的是真正的,非常不稳定的行为.大约30%的时间,当我单步执行时,它会弹出方法,或者它会单步执行两行代码!完全不奇怪的东西,我不习惯看到.

工作代码和非工作代码之间唯一的变化是通过我的插件加载代码引入MEF.因此,作为测试,我将插件程序集更改为仅导出一个界面,并且我在应用程序中硬编码了依赖于另一个(现在未实现的)界面的所有内容.现在COMExceptions消失了,奇怪的调试行为消失了.

这是人们以前见过的东西吗?如果不希望MEF允许类导出多个接口,那么在编写部件时不应该引发CompositionException吗?任何人都可以解释为什么MEF会导致这些奇怪的问题???

这是COMException时代主线程调用堆栈的示例.不确定它对任何人是否意味着什么,但如果你能提出任何调试方法,那就太好了.

> UIAutomationProvider.dll!MS.Internal.Automation.UiaCoreProviderApi.UiaHostProviderFromHwnd(System.IntPtr hwnd) + 0x38 bytes 
  UIAutomationProvider.dll!System.Windows.Automation.Provider.AutomationInteropProvider.HostProviderFromHandle(System.IntPtr hwnd) + 0x2d bytes 
  PresentationCore.dll!MS.Internal.Automation.ElementProxy.HostRawElementProvider.get() + 0x65 bytes 
  [Native to Managed Transition] 
  [Managed to Native Transition] 
  UIAutomationProvider.dll!System.Windows.Automation.Provider.AutomationInteropProvider.RaiseAutomationPropertyChangedEvent(System.Windows.Automation.Provider.IRawElementProviderSimple element, System.Windows.Automation.AutomationPropertyChangedEventArgs e) + 0x2a bytes 
  PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() + 0x2c9 bytes 
  PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() + 0x2f8 bytes 
  PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() + 0x2f8 …
Run Code Online (Sandbox Code Playgroud)

wpf mef export inversion-of-control

3
推荐指数
1
解决办法
3932
查看次数

使用数据库作为存储介质在.NET中实现日志记录库

我刚刚开始研究一个日志库,每个人都可以用它来跟踪用户运行我们的应用程序时的任何类型的系统信息.到目前为止,最简单的示例是跟踪信息,警告和错误.

我希望所有插件都能够使用此功能,但由于每个开发人员可能对报告的重要性有不同的想法,因此我希望尽可能保持通用.

在C++世界中,我通常会使用像a这样的东西stl::pair<string,string>作为键值对结构,并stl::list在日志中使用其中的一行作为"行".然后日志缓存就是list<list<pair<string,string>>>(呃!).这样,开发人员可以使用像INFO,WARNING,ERROR这样的const字符串键来为数据库中的列提供一致的命名(用于选择特定类型的信息).

我希望数据库能够处理任意数量的不同列名.例如,John可能有一个INFO行,其中一列名为USER,而Bill可能有一个INFO行,其中一列名为FILENAME.我希望日志查看器能够显示所有信息,如果一个报表没有INFO/FILENAME的值,那么这些字段应该只显示为空白.因此,一种选择是使用List<List<KeyValuePair<String,String>>>,另一种选择是让日志库使用者以某种方式"注册"其模式,然后让数据库执行ALTER TABLE处理这种情况.另一个想法是拥有一个仅用于键值对的表,其中一个外键将键值对映射回原始日志条目.

我显然不希望记录到陷入瘫痪系统,所以我只锁定日志高速缓存,使数据的副本(并删除已复制的数据),那么后台线程将转储信息到数据库中.

我对此的具体问题是:

  1. 你看到任何性能问题吗?换句话说,你有没有试过这样的事情,发现某些事情在实践中效果不好?
  2. 是否有更多的.NETish方法来实现键值对,除了List<List<KeyValuePair<String,String>>>
  3. 即使有办法更好地做#2,我上面提出的ALTER TABLE的想法是不是很糟糕?
  4. 你会推荐一个多个数据库吗?我还不知道日志写入的频率,但理想情况下我们希望有大量的低级信息.也许应该有一个只有低级别东西的固定模式的数据库,然后是另一个更灵活地向用户报告信息的数据库.

c# database sqlite logging

3
推荐指数
1
解决办法
3834
查看次数

无法在MVVM Light Toolkit的RelayCommand中将单个参数传递给lambda函数

我不知道Josh Smith和Laurent Bugnion的RelayCommand的实现是否有区别,但在我看过的每一个地方,听起来像RelayCommand的Execute部分可以带0或1个参数.我只能使它与0一起工作.当我尝试类似的东西时:

public class Test
{
    public RelayCommand MyCommand { get; set; }

    public Test()
    {
        MyCommand = new RelayCommand((param) => SomeFunc(param));
    }

    private void SomeFunc( object param)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:Delegate 'System.Action' does not take '1' arguments.为了确保我不是疯了,我去了RelayCommand的定义,以确保我的解决方案中没有一些流氓实现,但果然,它只是Action,而不是Action <>.

我到底在这里错过了什么?

wpf relaycommand mvvm-light

3
推荐指数
1
解决办法
2407
查看次数

匿名类,临时数据和匿名类的集合

我是匿名课程的新手,今天我想我遇到了第一个案例,我觉得我真的可以使用它们.我正在编写一个方法,可以将临时数据存储在类中,并且因为该类在该方法之外没有任何意义,所以使用匿名类确实对我有意义(至少在它做的时候) ).

在开始编码之后,我肯定会做出一些让步.我喜欢将计算之类的内容分配给临时变量,以便在调试期间我可以在逻辑块中一次验证一些计算.然后我想为最终值分配更简单的东西.该值将在匿名类中.

问题是,为了简明地实现我的匿名类代码,我想使用LINQ.这里的问题是我认为你不能在声明中做这样的临时计算. 或者你呢?

这是我想要做的一个人为的例子:

namespace AnonymousClassTest
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        ObservableCollection<RectanglePoints> Points { get; set; }

        public class RectanglePoints
        {
            public Point UL { get; set; }
            public Point UR { get; set; }
            public Point LL { get; set; }
            public Point LR { get; set; }
        }

        public class DontWantThis
        {
            public double Width { get; set; }
            public double Height { get; …
Run Code Online (Sandbox Code Playgroud)

c# linq anonymous-types anonymous-class

3
推荐指数
1
解决办法
3638
查看次数