2017-01-31 4 views
2

Я написал приложение WPF .NET (.NET 4.5), используя следующие библиотеки:C# .NET WPF приложений зависает случайным образом (WgxConnection_ShouldForceSoftwareForGraphicsStreamClient)

  • System.Windows.Interactivity.dll
  • Microsoft.Practices. ServiceLocation.dll
  • GalaSoft.MvvmLight.Platform.dll
  • GalaSoft.MvvmLight.Extras.dll
  • GalaSoft.MvvmLight.dll

Я использую 2 Таймеры:

  • System.Threading.DispatcherTimer (клещи каждые 200мс)

    • Просто задает свойство DateTime, который привязан к метке, чтобы DateTime.Now.
  • System.Timers.Timer (клещей каждую секунду)

    • Установить фокус на текстовое поле, запрашивает данные из веб-сервиса (в задаче асинхронном)
    • Обновление ICollectionView связан с Datagrid (с использованием Application.Current.Dispatcher.BeginInvoke)

Приложение работает на ~ 50 для Windows 7 машин (с 7 утра до 5 вечера) ш без каких-либо проблем.

На только 1 Windows 7 машины он просто случайно замерзает с высокой загрузкой процессора и единственной активной темой: WgxConnection_ShouldForceSoftwareForGraphicsStreamClient

Там нет записей в журнале событий Windows и нет пользовательских событий, который вызывает это.

ничего не могу найти об этом WgxConnection... Есть ли у кого-нибудь идеи?

EDIT:

Просто нашел фрагмент "UnsafeNativeMethods.WgxConnection_ShouldForceSoftwareForGraphicsStreamClient();" в MediaSystem.cs: https://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/windows/Media/MediaSystem.cs

-> wpfgfx_v0400.dll

Может быть "RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;" может изменить поведение?

ответ

0

Трудно определить проблему, не видя кода образца.

Вот несколько моментов, которые я могу думать о

  1. кода Пересмотреть и посмотреть, есть ли какой-либо код блокировки. Обратите внимание, что , поскольку вы используете таймеры, вы должны использовать реализацию потокового безопасного списка (ConcurrentQueue, ConcurrentStack, ConcurrentBag).
  2. Если он хорошо работает на всех настольных компьютерах, кроме одного, то посмотрите, есть ли у этого ПК несколько разных графических процессоров. Там может быть некоторая несовместимость между WPF и доступными драйверами графических процессоров.
  3. Попробуйте использовать Таймер диспетчера вместо System.Timers.Timer.
0

Ваш таймер отправки также может использоваться для выполнения системного таймера.

Просто введите инструкцию if модуля при проверке if(timer % 1000 == 0), а затем вызовите свои функции запроса данных асинхронного ввода.

Что касается основной проблемы, узнайте, что отличается на одном компьютере, использует ли она ту же графическую карту, как насчет водителя?

Используете ли вы масштаб или другие графические эффекты в любом месте программы?

Мои мысли о том, что на этой машине возникает какая-то проблема с драйвером, где он пытается внедрить эффект, а графики в этой системе не способны, и по какой-то причине рендеринг программного обеспечения не может быть включен, а затем застревает, пытаясь сделайте этот эффект в бесконечном цикле.

+0

Я еще не нашел разницы между этим и другими ПК относительно GPU. Я не использую никаких графических эффектов, кроме показанного «IsIndeterminate = true ProgressBar», в то время как фоновая работа выполняется. я установить частоту кадров до 20 из-за более высокую производительность (60fps по умолчанию): Timeline.DesiredFrameRateProperty.OverrideMetadata (... Интересно, если HW рендеринг действительно необходим в моем случае Там будет возможность отключить его. , настройка: ProcessRenderMode. –

+0

Программа работает каждый день без перерыва, она запускается каждый день утром. Проблема описана, возникает всего несколько дней ... –

+0

Используете ли вы таймер для fps или фактическую графическую карту command – Slipoch