Wpf Dispatchermer在通过远程桌面运行时冻结

Wpf Dispatchermer在通过远程桌面运行时冻结,wpf,remote-desktop,Wpf,Remote Desktop,在远程计算机上运行WPF应用程序并通过远程桌面访问它时,我遇到问题。应用程序似乎部分冻结:一些绑定起作用,一些不起作用。我们只在远程桌面连接时出现此问题,并且在几次连接/断开连接后出现此问题 我的应用程序应该是相对灵敏的,我们的用户希望确保即使没有直接与它交互,应用程序也不会被冻结(它是一种监控应用程序)。 为了实现这一点,我们在主窗口上添加了一个每秒滴答作响的简单时钟 通过Dispatchermer设置,时钟每250毫秒更新一次,优先级为数据绑定级别。我们只需在每个计时器计时时更新绑定到UI的

在远程计算机上运行WPF应用程序并通过远程桌面访问它时,我遇到问题。应用程序似乎部分冻结:一些绑定起作用,一些不起作用。我们只在远程桌面连接时出现此问题,并且在几次连接/断开连接后出现此问题

我的应用程序应该是相对灵敏的,我们的用户希望确保即使没有直接与它交互,应用程序也不会被冻结(它是一种监控应用程序)。 为了实现这一点,我们在主窗口上添加了一个每秒滴答作响的简单时钟

通过
Dispatchermer
设置,时钟每250毫秒更新一次,优先级为数据绑定级别。我们只需在每个计时器计时时更新绑定到UI的字符串

当应用程序被“冻结”(即时钟没有滴答声)时,我可以连接我的Visual Studio调试器,并查看计时器不再启用且没有滴答声

下面是一些代码:

MainWindow(我们的主UI)-代码隐藏

public class ViewModel : INotifyPropertyChanged
{
    private string _clock;

    public ViewModel()
    {
        var timer = new DispatcherTimer(DispatcherPriority.DataBind) { Interval = TimeSpan.FromMilliseconds(250), IsEnabled = true };
        timer.Tick += (o, e) => Clock = DateTime.Now.ToString("T");
    }

    public string Clock
    {
        get { return _clock; }
        set
        {
            _clock = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Clock)));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
主窗口-Xaml


有人知道在通过远程桌面连接时,什么会导致dispatcher计时器被禁用吗?

您不需要为此使用dispatcher。只需在后台线程上运行它。绑定会自动将INPC属性的更新封送到UI线程。此外,您可能希望增加更新之间的时间间隔。也许每900毫秒。减少UI线程上的压力。我不熟悉RDP是如何与WPF应用程序混在一起的,但这些就是我在尝试修复此问题时所做的更改。您不需要为此使用Dispatcher。只需在后台线程上运行它。绑定会自动将INPC属性的更新封送到UI线程。此外,您可能希望增加更新之间的时间间隔。也许每900毫秒。减少UI线程上的压力。我不熟悉RDP是如何与WPF应用程序混在一起的,但这些就是我在尝试解决这个问题时所做的更改。
<Window x:Class="RdpDispatcherTimer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="40pt" Text="{Binding Clock}"/>
</Window>
public class ViewModel : INotifyPropertyChanged
{
    private string _clock;

    public ViewModel()
    {
        var timer = new DispatcherTimer(DispatcherPriority.DataBind) { Interval = TimeSpan.FromMilliseconds(250), IsEnabled = true };
        timer.Tick += (o, e) => Clock = DateTime.Now.ToString("T");
    }

    public string Clock
    {
        get { return _clock; }
        set
        {
            _clock = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Clock)));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}