小编Pau*_*ich的帖子

C#Action,Closure和Garbage Collection

我是否需要将MyAction设置为null,以便垃圾收集能够继续使用这些类中的任何一个?

当两个班级的生命周期几乎相同时,我不太关心.当Class1的寿命比Class2长得多或者Class2的寿命比Class1长得多时,我的问题更合适.

这里的代码被删除了.假设Class1和Class2都包含可能影响其生命周期的其他成员和方法.

public class Class1 : IDisposable
{
    public Action<string> MyAction { get; set; }

    // Is this necessary?
    public void Dispose()
    {
        MyAction = null;
    }
}

public class Class2
{
    string _result = string.Empty;

    public void DoSomething()
    {
        Class1 myClass1 = new Class1();
        myClass1.MyAction = s => _result = s;
        myClass1.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# closures garbage-collection

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

PropertyChangedEventManager何时创建,何时附加?

简而言之......这是一个大型的WPF项目

我有一个实施的"患者"课程INotifyPropertyChanged.当我处理这个类时,我正在检查它是否PropertyChangedEventHandler为null,如果没有将它运行到一个ListenerDetector记录监听器的类,那么我们可以跟踪它们并清理泄漏.患者确实有一些绑定到WPF元素的属性以及PropertyChanged用于监视更改的其他对象.

处理完其他所有内容后,我的日志结果如下:

记录:患者仍然附有以下听众: - System.ComponentModel.PropertyChangedEventManager

问题:何时PropertyChangedEventManager创建?

  • 创建患者时
  • 当WPF绑定到患者属性时
  • 其他一点.

如果Patient.PropertyChangedEventHandler设置为null并因此断开连接PropertyChangedEventManager是否有任何方法可以重新创建管理器并让它Patient.PropertyChangedEventHandler再次收听?请不要问为什么会发生这种情况,这是一个紧张的地方:-(

.net wpf memory-leaks inotifypropertychanged

8
推荐指数
1
解决办法
2213
查看次数

Application.Current.MainWindow.Close vs Application.Current.Shutdown

应该Application.Current.Shutdown()不会被作为最佳实践关闭一个WPF应用程序?

我有一个小的多窗口应用程序,"关闭"似乎很好地适用于我的所有退出命令.但是,我被告知要经常使用Application.Current.MainWindow.Close().

wpf

7
推荐指数
1
解决办法
3076
查看次数

如何让[ProgramFilesFolder]填充到"C:\ Program Files"烧录UI项目

我有一个带有以下变量的Burn Bundle

<Variable Name="INSTALLFOLDER" Type="string "Value="[ProgramFilesFolder]" />

在我的bootstrapper UI项目的主视图模型中具有以下属性

 public string InstallDirectory
    {
        get
        {
            if (_Engine.StringVariables.Contains("INSTALLFOLDER"))
                return _Engine.StringVariables["INSTALLFOLDER"];
            return string.Empty;
        }
        set
        {
            if (_Engine.StringVariables.Contains("INSTALLFOLDER"))
            {
                _Engine.StringVariables["INSTALLFOLDER"] = value;
                OnPropertyChanged("InstallDirectory");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

在我的WPF视图中,它有一个绑定到InstallDirectory属性的文本框,我只看到"[ProgramFiles文件夹]",但我希望看到类似"C:\ Program Files"的内容

我想最终得到类似下面的内容,它将使用默认安装文件夹填充我的安装目录文本框,并为用户提供在那里更改它的选项.

<Variable Name='INSTALLFOLDER' Type='string' Value='[ProgramFilesFolder]$(var.AppName)' />
Run Code Online (Sandbox Code Playgroud)

我可以使用Net Framework获取我的WPF UI的程序文件文件夹,但似乎我应该可以从Wix Bundle获取它.此外,Wix日志显示我正在从我的UI设置INSTALLFOLDER属性.

我的bootstrapper Run看起来像这样:

    protected override void Run()
    {
        this.Engine.Log(LogLevel.Verbose, "Run has been called on the UI application.");

        CurrentDispatcher = Dispatcher.CurrentDispatcher;
        _MainWindow = new MainWindow(new MainWindowViewModel(this));

        Engine.Detect();

        _MainWindow.Show();
        Dispatcher.Run();

        Engine.Quit(0);
    }
Run Code Online (Sandbox Code Playgroud)

我以为我可能需要在BootstrapperApplication上听一些事件,之后我可以触发针对InstallDirectory属性更改的属性但是还没有找到任何有趣的东西.

我已经阅读了3.6的开发人员指南书,虽然最后两章确实讨论了刻录项目和WPF,但它似乎没有解决这个问题.

wix wix3.7

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