C# 何时使用WPF中的Rx处理鼠标事件
给定以下代码:C# 何时使用WPF中的Rx处理鼠标事件,c#,wpf,system.reactive,C#,Wpf,System.reactive,给定以下代码: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var mouseMove = Observable .FromEventPattern<MouseEventHandler, MouseEventArgs>( eventHandler =>
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
});
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var mouseMove=可观察
.FromEventPattern(
eventHandler=>this.MouseMove+=eventHandler,
eventHandler=>this.MouseMove-=eventHandler);
var mouseMoveSubscription=mouseMove.Subscribe(args=>
{
//做点什么
});
}
}
如果我希望订阅遵循主窗口的生命周期,则正确的\最佳处置位置\取消订阅mouseMoveSubscription。我主要担心的是,我不会导致持续超过windows生命周期的内存泄漏。谢谢。我认为从窗口生命周期的角度来看,最好的地方是活动
这是窗口关闭过程的开始(如图所示)或)-我发现最好在我知道要卸载(或在这种情况下取消订阅)所有内容后立即卸载。如果您需要以任何理由尽可能长的订阅,请使用<代码>关闭< /代码>。 以RX更复杂的方式来做这件事,考虑从上面提到的“关闭事件”中创建一个可观察流。 e、 g。 var closingObservable=Observable.FromEventPattern(this.Closing…等) 然后,修改您的查询以使用Take,直到: mouseMove.TakeUntil(closingObservable).Subscribe(args=>
然后你就不必关心自己的明确处置。我大体上同意@Honza的观点,即
关闭
是做这件事的合适地方,但我通常遵循这种模式来“托管”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);
}
}
如果我在关闭事件中执行此操作,但我有几个订阅关闭事件的订阅方,其中一个尝试取消关闭,您将如何处理这种情况。我将使用
关闭事件。它仅在窗口真正关闭时才会被触发。之后还有一个事件,卸载,但可能会出现一些问题是的。