C#多线程下载图片 URL转Image


C# 全选
    public class UrlToImageConvert
    {
        int _maxTaskCount;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="maxTaskCount">允许最大同时下载数量</param>
        public UrlToImageConvert(int maxTaskCount)
        {
            _maxTaskCount = maxTaskCount;
        }
        ConcurrentQueue<ImageDownTaskInfo> taskQueue = new ConcurrentQueue<ImageDownTaskInfo>();
        /// <summary>
        /// 添加下载任务
        /// </summary>
        /// <param name="url"></param>
        /// <param name="action"></param>
        public void Add(string url, Action<Image> action)
        {
            taskQueue.Enqueue(new ImageDownTaskInfo(url, action));

            if (tasks.Count <= _maxTaskCount)
            {
                tasks.Add(Task.Run(() =>
                {
                    while (taskQueue.TryDequeue(out var ti))
                    {
                        var image = DownImageFromUrl(ti.url);
                        ti.SuccessAction(image);
                    }
                }));
            }
        }

        Image DownImageFromUrl(string imageUrl)
        {
            try
            {
                WebRequest request = WebRequest.Create(imageUrl);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (Stream stream = response.GetResponseStream())
                {
                    return Image.FromStream(stream);
                }

                //using (WebClient client = new WebClient())
                //{
                //    byte[] imageData = client.DownloadData(imageUrl);
                //    using (var stream = new System.IO.MemoryStream(imageData))
                //    {
                //        return Image.FromStream(stream);
                //    }
                //}
            }
            catch
            {
                return null;
            }

        }
        List<Task> tasks = new List<Task>();
        /// <summary>
        /// 等待任务完成
        /// </summary>
        public void WaiteAll()
        {
            Task.WaitAll(tasks.ToArray());
        }
    }

    public class ImageDownTaskInfo
    {
        public ImageDownTaskInfo(string url, Action<Image> successAction)
        {
            this.url = url;
            SuccessAction = successAction;
        }

        public string url { get; set; }
        public Action<Image> SuccessAction { get; set; }
    }

使用:

C# 全选
DataDetail data = new bllProductionProcessOrder().GetDataDetail(new JOCAPI.CommonModels.Req_ByID()
{
	Id = current.RowID
});

UrlToImageConvert urlImageHelper = new UrlToImageConvert(5);
// 下载网络图片
data.ImgURL = Globals.ServerHost + data.ImgURL;
urlImageHelper.Add(Globals.ServerHost + data.ImgURL, img => { data.Img = img});

// 明细列表中图片下载
//foreach (var item in data.DetailProcessOrder_Material)
//{
//    urlImageHelper.Add(Globals.ServerHost + item.ImgURL, img => { item.Img = img});
//}

urlImageHelper.WaiteAll(); // 等待所有图片都下载完毕

 

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:PDA android获得屏幕设计尺寸
下一篇:EFCore DbContext扩展执行原生SQL查询对象集合
评论列表

发表评论

评论内容
昵称:
关联文章

C#线下载图片 URLImage
C# 线入门系列(三)
C# 线入门系列(二)
C# 线入门系列(一)
C# RestSharp上传和下载图片
SQLite Database 线访问需要注意的问题
Python线中试用wmi报错
.Net 线安全集合
C#汉字拼音
ManualResetEvent实现线的暂停与恢复
Devexpress 表格GridView列RepositoryItemPictureEdit异步加载远程URL图片
DevExpress表格GridControl添加操作列单元格添加图片按钮并且实现点击链接URL浏览器
C#图片处理
软件:批量HEICJPG 苹果手机照片格式JPG
C# PNGICO,ICOPNG,PNG图标常规尺寸互
下载 Internet Download Manager
谷歌浏览器离线下载
ASP.NET MVC使用@Url.Action 个参数中间&被URL编码了
C# 利用 SharpZipLib 对个文本字符串进行文件打包为RAR或ZIP并进行下载
C#中URL编码

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码