我使用System.Threading.Thread在C#.NET 1.1中创建了一个Ticker组件(System.Windows.Forms.UserControl)。此代码将从右向左滚动并从XML Feed中读取数据。我们的主应用程序将使用视频和其他进程运行该组件。限制C#.NET 1.1中Ticker组件的CPU使用率
测试没有Ticker组件的应用程序会消耗55%的CPU最大值,但是,当集成Ticker组件时,它会高达95%。
我也尝试过使用System.Windows.Forms.Timer,但结果是一样的。
XML数据的解析仅由组分的初始化期间发生,并且这里是示例代码段将处理股票滚动:
Thread _mainThread;
private void InitTickerThread()
{
_panelHeadlines = (Panel) FindControl("panelHeadlines", this);
if(_panelHeadlines != null)
{
_textWidth = _panelHeadlines.Size.Width;
}
_locXOffset = 0;
_mainThread = new Thread(new ThreadStart(StartScrolling));
_mainThread.Name = "Main Ticker Thread";
_mainThread.Priority = ThreadPriority.Lowest;
_mainThread.IsBackground = true;
_mainThread.Start();
}
private void StartScrolling()
{
while(true)
{
lock(this)
{
_locXOffset -= 1;
if (_locXOffset < -_textWidth) //If entire ticker content has finished scrolling.
{
_locXOffset = 0;
_partnerCtr = 0;
Partner p = _arrListPartners[_partnerCtr] as Partner;
if(p != null)
{
pbPartnerLogo.Image = p.Logo;
_partnerContentWidth = p.ContentWidth - _offsetToChangeLogo;
}
}
else
{
if(_locXOffset < -_partnerContentWidth)
{
_partnerCtr++;
if(_arrListPartners.Count > 0)
{
if(_partnerCtr < _arrListPartners.Count)
{
Partner p = _arrListPartners[_partnerCtr] as Partner;
if(p != null)
{
pbPartnerLogo.Image = p.Logo;
_partnerContentWidth = p.ContentWidth - _offsetToChangeLogo;
}
}
}
}
}
_panelHeadlines.Location = new Point(_locXOffset, 0);
Invalidate();
Thread.Sleep(20);
}
}
}
任何帮助高度赞赏。谢谢!
您的后台线程每20ms执行一次工作,即每秒执行50次。我建议大幅度降低这一点。 – Lazarus 2011-04-07 08:52:46
我实际上将其设置为20ms,以达到所需的滚动速度。 – 2011-04-07 10:44:23