小编Ben*_*ith的帖子

在托管的Win8 metro应用程序中查找内存泄漏?

我目前正在使用C#和SharpDX为Windows 8开发一款地铁游戏.该项目进展顺利,但最近需要开始追踪内存泄漏,我不确定从哪里开始.

Visual Studio 11中的内置内存分析器不适用于Metro应用程序,WinDBG似乎无法连接到metro应用程序(除非我使用不正确),而且我很难找到任何有关查看.NET 4.5 for metro中的托管分配.

有人对这个有经验么?有一个好的地方开始寻找?有没有人成功使用工具来帮助检测Metro应用中的内存泄漏?

c# memory-management managed microsoft-metro windows-8

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

使用C#扩展方法处理事件

我最近学会了使用C#扩展方法来简化调用事件,并且我越来越多地使用它们.我最近遇到了一个我不理解的奇怪问题,我想知道是否有人可以解释它.

尝试将eventhandler扩展方法设置为另一个事件的事件处理程序时,会出现此问题.这是我正在做的一个例子:

public static class EventHandlerExtensions
{
    public static void Raise<TEventArgs>(
        this EventHandler<TEventArgs> eventHandler, 
        object sender, TEventArgs args)  where TEventArgs:EventArgs
    {
        if (eventHandler != null)
        {
            eventHandler(sender, args);
        }
    }
}

public class Test
{
    private event EventHandler<EventArgs> EventA;
    private event EventHandler<EventArgs> EventB;

    public Test()
    {
        Console.WriteLine("::Start");
        EventB += EventA.Raise;
        EventA += (s, a) => Console.WriteLine("Event A raised");
        EventB.Raise(this, EventArgs.Empty);
        Console.WriteLine("::End");
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,EventA应在触发EventB时触发.但是,当我运行此代码时,EventB会触发,但A上的扩展方法找不到任何侦听器.

如果我改变订单,一切正常:

Console.WriteLine("::Start");
EventA += (s, a) => Console.WriteLine("Event A raised");
EventB += EventA.Raise;
EventB.Raise(this, EventArgs.Empty);
Console.WriteLine("::End"); …
Run Code Online (Sandbox Code Playgroud)

c# windows events lambda extension-methods

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