2014-12-11 5 views
2

У меня есть приложение C# Winforms, которое разговаривает с USB-устройством через библиотеку поставщика. Я запускаю этот интерфейс с фоновым потоком. Во время конструктора поставщика весь графический интерфейс приложения Winforms заморожен. Одно ядро ​​процессора составляет 100%, но остальные ядра простаивают. Как определить, что вызывает поставщик, чтобы блокировать графический интерфейс?Почему блокирование фонового потока GUI

бегает фоновый поток, как это -

public HardwareInterfaceClass() { 
    var hardwareThread = new Thread(HardwareInterfaceThread); 
    hardwareThread.IsBackground = true; 
    hardwareThread.Name = "USB Interface Communication"; 
    hardwareThread.Start(); 
    return 
} 


private void HardwareInterfaceThread() { 

    var usbInterface = new USBInterfaceHardware(0); // Takes 5 seconds and blocks GUI 
    ... 

} 
+2

Блокирует ли пользовательский интерфейс или он очень занят? –

+0

Вы когда-нибудь вызывали что-либо в этом API с помощью основного потока? потому что они могли захватить ваш «SynchronizationContext» и опубликовать рабочие элементы в нем. –

+6

Является ли эта третья сторона DLL, возможно, страдающей близостью к основной теме? У меня было это однажды, я должен был убедиться, что все объекты были созданы в другом потоке. Не помню, было ли это связано с STA/MTA. –

ответ

2

Там нет ничего вообще в коде вы публикуемый, что будет блокировать поток пользовательского интерфейса. Таким образом, существует две возможности:

  1. В коде библиотеки есть что-то, что блокирует поток пользовательского интерфейса.
  2. Нить пользовательского интерфейса на самом деле не заблокирована.

Невозможно точно знать, что является правильным, хотя первый вариант был бы очень необычным, особенно если вы фактически ничего не передали библиотечному коду, который бы даже сказал, где ваш поток пользовательского интерфейса (но не невозможно & hellip, он может иметь внутреннюю логику, которая ищет ваш поток пользовательского интерфейса и каким-то образом вмешивается в него).

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

Если ваш фоновый поток занимает процессорное время в стороне от потока пользовательского интерфейса, вы можете исправить это, установив hardwareThread.Priority = ThreadPriority.BelowNormal;. Действительно, это хорошая идея для любого потока, который вращается, потребляя 100% процессорного времени ядра.

Существует, конечно, третья возможность: в вашем собственном коде вы каким-то образом заблокировали поток пользовательского интерфейса, когда этот фоновый поток работает. Но без краткого, полного примера кода было бы невозможно объяснить, где это. Мы можем посмотреть только на код, который вы опубликовали, и этот код не блокирует пользовательский интерфейс нигде.

Смежные вопросы