【发布时间】:2010-12-30 12:27:15
【问题描述】:
如果这是一个愚蠢的问题,我提前道歉。我的职业是嵌入式 C 程序员,C# 对我来说相对较新。
我有一个应用程序,它基本上归结为以下内容:一个线程轮询外部接口(如果有人感兴趣,可以使用 profibus),当输入数据发生变化时,会引发一个事件并处理新数据。 由于我需要更新的数据使用数据绑定,因此我调用了调度程序。此设置可正常工作数百万次,但有时在执行委托中的代码之前最多需要 6 秒。由于没有其他线程,我看不出有任何原因。 我使用以下事件处理程序。 Container 是对该类数据绑定的 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 来回溯运行的内容。
非常感谢任何输入。
【问题讨论】:
-
使用性能分析器(例如 Red Gate ANTS Profiler)是否有助于找到 6 秒的去向?还是需要数年才能找到百万分之一的发生?
-
运行这个的机器的规格是什么?是普通 PC 还是精简设备?
-
幸运的是不需要几年时间。有时应用程序运行一整夜没有任何问题,但大多数情况下它会在启动后一个小时内发生。我会调查分析器,但恐怕我们没有此类软件的任何许可证。我会看看能不能找到一些免费软件替代品。
-
这是一台普通的PC。我通常做嵌入式,但这是一个模拟我们的嵌入式平台与之交互的东西的工具
-
ANTS Profiler 可免费试用 30 天。应该足以找到问题,如果它真的有帮助,也许有钱可以解决下一个类似问题,如果它可以节省您的时间。
标签: c# .net dispatcher