2

次のコードがあるとします。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var mouseMove = Observable
            .FromEventPattern<MouseEventHandler, MouseEventArgs>(
            eventHandler => this.MouseMove += eventHandler,
            eventHandler => this.MouseMove -= eventHandler);

        var mouseMoveSubscription = mouseMove.Subscribe(args =>
        {
            //Do Something
        });
    }
}

サブスクリプションが MainWindow の有効期間に従うようにしたい場合、mouseMoveSubscription から破棄する\サブスクリプションを解除する正しい\最適な場所はどこですか。私の主な関心事は、Windows の有効期間を過ぎても続くメモリ リークを引き起こさないことです。ありがとう。

4

3 に答える 3

3

Rx でより構成可能な方法でこれを行うには、上記の人々が既に言及した「CloseEvent」から Observable ストリームを作成することを検討してください。

例 var ClosingObservable = Observable.FromEventPattern(this.Closing... etc) 次に、TakeUntil を使用するようにクエリを修正します。

そうすれば、明示的な破棄について気にする必要はありません。

于 2013-02-11T09:55:43.960 に答える
1

私は一般的に、これを行うのに適切な場所である @Honza に同意しますClosingが、「ホストされている」場合は一般的にこのパターンに従いIDisposablesます。場所によってはやり過ぎかもしれませんが、一般的に適用できるほど軽量なパターンであることがわかりました。

// Window, application, etc - some longish-living object
public class Something : IDisposable
{
    CompositeDisposable _disposables = new CompositeDisposable();

    public Something()
    {
         // A composite disposable acts like a "bucket" of IDisposables
         // that are all disposed when the bucket is disposed.
          _disposables.Add(SomeObservable.Subscribe(...));
          _disposables.Add(SomeOtherObservable.Subscribe(...));
          _disposables.Add(YetAnotherObservable.Subscribe(...));

         // Here, optionally wire some "Yo, I should dispose when this happens" handler
         this.Closed += (o,e) => Dispose();
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // clean up managed resources here
            if(_disposables != null)
            {
                _disposables.Dispose();
            }
        }   
        // clean up unmanaged resources here
    }

    ~Something()
    {
        Dispose(false);
    }
}
于 2013-02-11T16:10:22.740 に答える
1

ウィンドウの寿命という観点からは、Closingイベントが最適な場所だと思います。

これは、ウィンドウのシャットダウン プロセスの始まりです (ここまたはここに示されているように) - アンロードする (またはこの場合はサブスクライブ解除する) ことがわかったら、すぐにすべてをアンロードする方がよいと思います。何らかの理由でできるだけ長く購読を続ける必要がある場合は、Closed代わりに偶数を使用してください。

于 2013-02-11T03:00:25.860 に答える