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开发框架网发布内容,转载请附上原文出处连接
post 张国生