我遇到了有关 WPF 的内存泄漏问题。我有一个未处理的视图模型。
我将问题缩小到调用数据库并更新 viewModel 上的字段的方法。
事情是这样的:
public async Task RefreshAsync2(CancellationToken token = default)
{
var data = await Mediator.Send(new GetDataQuery());
if (data != null)
{
Dispatcher.CurrentDispatcher.Invoke(() => {
ViewModelInfo = data;
});
}
}
在这个方法中,问题在于
Dispatcher.CurrentDispatcher.Invoke
使用匿名(lambda)方法来捕获“this”。
我必须使用Dispatcher,因为这个刷新方法可以从另一个线程调用,即。计时器。
如何摆脱这个?
使用
Dispatcher.CurrentDispatcher
无论如何都是错误的。它将为尚不存在的(后台)线程创建一个新的调度程序。请参阅此处:
获取当前正在执行的线程的 Dispatcher,并创建一个新的 Dispatcher(如果尚未与该线程关联)。
这不是你想要的。使用
Application.Current.Dispatcher
或以某种方式将 UI 调度程序作为参数传递给视图模型。
但是,假设你打电话
await RefreshAsync2();
从 UI 线程中,您根本不需要 Dispatcher 调用。这段代码应该足够了:
public async Task RefreshAsync2(CancellationToken token = default)
{
var data = await Mediator.Send(new GetDataQuery());
if (data != null)
{
ViewModelInfo = data;
}
}