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