编程语言
首页 > 编程语言> > c# – 延迟加载和多线程

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