WPF 未处理视图模型

问题描述 投票:0回答:1

我遇到了有关 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,因为这个刷新方法可以从另一个线程调用,即。计时器。

如何摆脱这个?

wpf .net-4.5 dispatcher
1个回答
1
投票

使用

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.