c# – 延迟加载和多线程
作者:互联网
我正在尝试使用iCarousel库进行单点操作.我成功地移植了库,一切都运行得很好但是如果你输入太多带有图像的UIImageViews应用程序会崩溃,这是正常的,因为iCarousel就像一个UIScrollView.
我必须从辅助线程以某种方式使用延迟加载系统,一次只显示3-4张图像,但我不知道如何使这项工作顺利进行.
此时,我在iCarousel代表中设置了这个:
bool threadsAlive = true;
public cDelegate()
{
ThreadPool.QueueUserWorkItem( delegate { refresh_visible(); } );
}
public override void DidScroll (iCarousel carousel)
{
scrolling = true;
}
public override void DidEndScrollingAnimation (iCarousel carousel)
{
scrolling = false;
//show images that are currently on the screen
ThreadPool.QueueUserWorkItem( delegate { ShowCurrent(); } );
//hides images that are not on the screen
ThreadPool.QueueUserWorkItem( delegate { hideInvisibleImages(); } );
}
void refresh_visible()
{
while( threadsAlive )
{
while( scrolling )
{
ShowCurrent();
}
}
}
void refresh_hidden()
{
while( threadsAlive )
{
while( scrolling )
{
hideInvisibleImages();
}
}
}
public void ShowCurrent()
{
var ds = _carousel.DataSource as cDataSource;
var left_index = _carousel.CurrentItemIndex - 1;
var right_index = _carousel.CurrentItemIndex + 2;
if( left_index < 0 ) left_index = 0;
if( right_index >= ds.Lista.Count ) right_index = ds.Lista.Count - 1;
//
for( var i = left_index; i < right_index ; i++ )
{
var img = ds.Lista[i];
if( img.Image == null )
{
BeginInvokeOnMainThread( delegate{
img.Image = UIImage.FromFile( img.UserObject.ToString() );
});
}
}
}
void hideInvisibleImages()
{
Console.WriteLine("ascund!");
var ds = _carousel.DataSource as cDataSource;
var left_index = _carousel.CurrentItemIndex - 1;
var right_index = _carousel.CurrentItemIndex + 2;
if( left_index < 0 ) left_index = 0;
if( right_index >= ds.Lista.Count ) right_index = ds.Lista.Count - 1;
//
for( var i=0; i<left_index; i++ )
{
var img = ds.Lista[i];
if( img.Image != null )
{
img.Image.Dispose();
img.Image = null;
}
}
for( var i=right_index; i<ds.Lista.Count; i++ )
{
var img = ds.Lista[i];
if( img.Image != null )
{
img.Image.Dispose();
img.Image = null;
}
}
}
代码实际上非常简单:有一个主线程只显示当前索引左侧的1个图像和两个图像,另一个清除所有其他图像的线程隐藏它们.
它工作正常,内存还可以,但它在设备上并不流畅,当我滚动时它会“挂起”一点.还有另一种方法吗?或许我应该改变算法?
解决方法:
您有一个循环,不允许CPU到任何其他线程/进程,并将导致非常高的CPU利用率.滚动时,它会挂起.
尝试在refresh_visible方法中使用Thread.Sleep(1)或小睡眠时间.
标签:c,ios,multithreading,xamarin-ios,uiscrollview 来源: https://codeday.me/bug/20190626/1292200.html