我使用System.Threading.Thread在C#.NET 1.1中创建了一个Ticker组件(System.Windows.Forms.UserControl)。此自动收录器将从右向左滚动并从xml Feed中读取数据。我们的主应用程序将使用视频和其他正在运行的进程调用此组件。
在没有自动收报机组件的情况下测试应用程序会消耗最多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);
}
}
}
非常感谢任何帮助。谢谢!
答案 0 :(得分:0)
每20毫秒重绘整个组件。这非常昂贵。我的建议是增加睡眠,和/或提高代码效率。
答案 1 :(得分:0)
您确定通过向前台UI线程发布消息来更新UI控件吗? (你的代码示例不完整,所以我无法真正说出来)