Заранее извиняюсь, если это глупый вопрос.Я по профессии программист на C, и C # для меня относительно новый.
У меня есть приложение, которое в основном сводится к следующему: один поток, который опрашивает внешний интерфейс (profibus, если кому-то это интересно), когда входные данные изменяются, возникает событие и обрабатываются новые данные.Поскольку данные, которые мне нужно обновить, используют привязку данных, я вызываю диспетчер.Эта настройка работает должным образом миллионы раз, но иногда для выполнения кода в делегате требуется до 6 секунд.Поскольку других тем нет, я не вижу причин для этого.Я использую следующий обработчик событий.Контейнер - это ссылка на TabItem, к которому привязан класс.
public void newSlave_InputChanged(object sender, InputChangedEventArgs e)
{
DateTime beforeDisp = DateTime.Now;
Container.Dispatcher.Invoke(DispatcherPriority.Send, (Action)delegate()
{
DateTime afterDisp = DateTime.Now;
if (afterDisp.Subtract(beforeDisp).TotalSeconds > 1)
{
/* Breakpoint here to detect the problem */
}
/* Do the work I need to do */
}
);
}
Поток, опрашивающий внешний интерфейс, в основном выглядит примерно так:
void monitorSlaves()
{
while (true)
{
if (cardOnline)
{
foreach (slave slv in slaves)
{
/* get the data */
if (dataChanged)
{
/* raise event */
}
}
}
Console.WriteLine(string.Format("{0}: Monitor slaves", DateTime.Now));
}
Thread.Sleep(200);
}
}
Я добавил печать впосмотрите, работает ли этот поток, пока диспетчер "зависает".Как оказалось, это не так.Я понятия не имею, что делает программа в считанные секунды между вызовом и выполнением, поскольку, насколько мне известно, других потоков нет.К сожалению, у меня нет окончательной лицензии на Visual Studio 2010, поэтому я не могу использовать intellitrace для отслеживания того, что было запущено.
Любая информация очень ценится.