Я проводил стресс-тестирование своих C # Windows Forms и программ WPF вместе с "HeavyLoad". HeavyLoad - это приложение для стресс-тестирования вашего ПК с целью проверки надежности его работы. Что не так с моей программой.
Я вижу, что всякий раз, когда я запускаю HeavyLoad, используя все доступные ядра, моя программа начинает терять события. Это также происходит со следующим простым кодом:
XAML:
<Window x:Class="MultithreadedWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MultithreadedWPF"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</StackPanel>
</Window>
Код позади:
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _myText = string.Empty;
/// <summary>
/// This property is bound to a text box in my user interface.
/// </summary>
public string MyText
{
get { return _myText; }
set
{
_myText = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("MyText"));
}
}
public MainWindow()
{
InitializeComponent();
//Create a timer to fire every second.
Timer timer = new Timer(1000);
timer.AutoReset = true;
timer.Elapsed += Timer_Elapsed;
timer.Start();
DataContext = this;
}
/// <summary>
/// The timer's previously elapsed time.
/// </summary>
DateTime previous = DateTime.Now;
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
//Save the current date and time.
DateTime now = DateTime.Now;
//Set the text accordingly.
MyText = $"{now.ToString("HH:mm:ss")}, delta: {now - previous}";
//Save the current time to calculate the next delta.
previous = now;
}
}
Это происходит в Windows Forms, а также в WPF.
Что я вижу:
- При работе без HeavyLoad:
- Если моя программа сфокусирована: дельта составляет около 1 секунды.
- Если моя программа не сфокусирована: дельта составляет около 1 секунды.
- При запуске HeavyLoad:
- Если моя программа сфокусирована: дельта находится где-то между 1-3 секундами.
- Если моя программа не сфокусирована: дельта находится где-то между 3-15 секундами.
Это означает, что не только пользовательский интерфейс не обновляется, но и событие в коде позадине работает или теряется. В противном случае дельта всегда будет около 1 секунды.
Вопрос:
РЕДАКТИРОВАТЬ: я использовал System.Timers.Timer в моем примере. Не Диспетчер Таймер. После переключения на таймер timeapi.h (AccurateTimer) я заметил, что события задерживаются, а не пропускаются.
В качестве примера я использую таймеры. В других моих программах такие же проблемы возникают с событиями, полученными от клиентов TCP. В реальной ситуации у меня возникают те же проблемы без запуска HeavyLoad, возможно, через Центр обновления Windows или другие процессы. Мы стараемся максимально минимизировать другие процессы. Во время выполнения нашей программы другие программы (кроме служб Windows и т. П.) Не выполняются.
Есть ли способ обойти эту проблему? Возможно, заставив нашу программу не работать на определенном ядре? Использование другой версии Windows (например, LTSC, IoT и т. Д.)?
Установка моей программы с более высоким (или самым высоким) приоритетом, по-видимому, не дает достаточного эффекта.