Nopcommerce 使用Task时dbcontext关闭问题
1、开启一个线程
Task.Run(() => { CreatPrintImage(preViewModel.DiyProductGuid); });
2、线程代码
/// <summary>
/// 生成打印图片 (这里一定要异步,开另外一个线程调用,不用接受返回)
/// </summary>
/// <param name="diyGuid"></param>
/// <returns></returns>
public void CreatPrintImage(string diyGuid)
{
lock (obj)
{
using (var lifeTime = EngineContext.Current.ContainerManager.Container.BeginLifetimeScope())
{
var productService = lifeTime.Resolve<IProductService>();
var pictureService = lifeTime.Resolve<IPictureService>();
var downloadService = lifeTime.Resolve<IDownloadService>();
var product = productService.GetProdcutByDiyGuid(diyGuid);
//var product = _productService.GetProductById(productId);
var diyItem = product.DiyItem;
var diyItemTemplate = diyItem.DiyItemTemplates.FirstOrDefault();
foreach (var pp in product.ProductPictures)
{
#region 合成打印图片
double bitmapWidth = 0;
double bitmapHeight = 0;
if (diyItemTemplate != null)
{
//如果是盒子
if (diyItem.DiyType.IdentNumber == "10005")
{
switch (pp.DiyItemTemplateName)
{
case "上":
bitmapWidth = diyItemTemplate.EditWidth;
bitmapHeight = diyItemTemplate.EditHeight;
break;
case "下":
bitmapWidth = diyItemTemplate.EditWidth;
bitmapHeight = diyItemTemplate.EditHeight;
break;
case "左":
bitmapWidth = diyItemTemplate.EditHeight;
bitmapHeight = diyItemTemplate.EditLong ?? 0;
break;
case "右":
bitmapWidth = diyItemTemplate.EditHeight;
bitmapHeight = diyItemTemplate.EditLong ?? 0;
break;
case "中":
bitmapWidth = diyItemTemplate.EditWidth;
bitmapHeight = diyItemTemplate.EditLong ?? 0;
break;
}
}
else
{
bitmapWidth = diyItemTemplate.EditWidth;
bitmapHeight = diyItemTemplate.EditHeight;
}
var bitmap = new Bitmap((int)bitmapWidth, (int)bitmapHeight);
var huabug = Graphics.FromImage(bitmap);
foreach (var sideItem in pp.DiyInfoSideItems.OrderBy(s => s.DisplayOrder))
{
var printDiyInfo = new PrintDiyInfo();
printDiyInfo.RotationAngle = sideItem.DiyInfoRotate;
printDiyInfo.CenterMarginLeft = sideItem.CenterMarginLeft ?? 0;
printDiyInfo.CenterMarginTop = sideItem.CenterMarginTop ?? 0;
printDiyInfo.TemplateZoom = pp.ShowScaling ?? 0;
printDiyInfo.EditWidth = 0;
printDiyInfo.EditHeight = 0;
//如果是盒子
if (diyItem.DiyType.IdentNumber == "10005")
{
switch (pp.DiyItemTemplateName)
{
case "上":
printDiyInfo.RotationAngle = 180;
break;
case "下":
printDiyInfo.RotationAngle = 0;
break;
case "左":
printDiyInfo.RotationAngle = 90;
break;
case "右":
printDiyInfo.RotationAngle = 270;
break;
}
}
//如果是图片或者是贴纸
if (sideItem.DiyInfoType == DiyInfoTypeEnum.Picture ||
sideItem.DiyInfoType == DiyInfoTypeEnum.Paster)
{
string originalPictureUrl = sideItem.DiyInfoType == DiyInfoTypeEnum.Picture ? pictureService.GetPictureUrl(sideItem.PictureId ?? 0) : pictureService.GetPictureUrl(sideItem.PasterId ?? 0);
var mapPath = _webHelper.MapPath(originalPictureUrl.Substring(originalPictureUrl.IndexOf("/Content", StringComparison.Ordinal)));
var bit = new Bitmap(mapPath);
//缩放
var bm1 = new Bitmap(bit, Convert.ToInt32(bit.Width * printDiyInfo.TemplateZoom * sideItem.DiyInfoZoom), Convert.ToInt32(bit.Height * printDiyInfo.TemplateZoom * sideItem.DiyInfoZoom));
var ms = new MemoryStream();
bm1.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bytes = ms.GetBuffer();
//旋转
var imageFactory = new ImageFactory();
imageFactory.Load(bytes);
imageFactory.Rotate((float)printDiyInfo.RotationAngle);
var rotationImage = imageFactory.Image;
if (rotationImage != null)
{
var pointx = Convert.ToInt32(printDiyInfo.CenterMarginLeft * printDiyInfo.TemplateZoom - rotationImage.Width / 2);
var pointy = Convert.ToInt32(printDiyInfo.CenterMarginTop * printDiyInfo.TemplateZoom - rotationImage.Height / 2);
var ulCorner = new Point(pointx, pointy);
huabug.DrawImage(rotationImage, ulCorner);
}
}
else if (sideItem.DiyInfoType == DiyInfoTypeEnum.Font)
{
var sidefont = downloadService.GetDownloadById(sideItem.FontId ?? 0);
if (sidefont != null)
{
var fontUrl = _webHelper.MapPath(sidefont.DownloadUrl);
var frm = new PrivateFontCollection();
frm.AddFontFile(fontUrl);
var fontFamily = frm.Families[0];
var fontSize = 51 * (float)sideItem.DiyInfoZoom;
var fontColor = ColorTranslator.FromHtml(sideItem.FontColor);
var fontStyle = new FontStyle();
if ((sideItem.FontIsBold ?? false) && (sideItem.FontIsItalic ?? false))
{
fontStyle = FontStyle.Bold | FontStyle.Italic;
}
else if ((sideItem.FontIsBold ?? false))
{
fontStyle = FontStyle.Bold;
}
else if (sideItem.FontIsItalic ?? false)
{
fontStyle = FontStyle.Italic;
}
var font = new Font(fontFamily, fontSize, fontStyle);
//定义颜色
var sbrush = new SolidBrush(fontColor);
// 绘制围绕点旋转的文本
var pointx = Convert.ToInt32(printDiyInfo.CenterMarginLeft * printDiyInfo.TemplateZoom);
var pointy = Convert.ToInt32(printDiyInfo.CenterMarginTop * printDiyInfo.TemplateZoom);
var point = new PointF(pointx, pointy);
//var point = new PointF(200, 200);
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
Matrix mtxRotate = huabug.Transform;
mtxRotate.RotateAt((float)printDiyInfo.RotationAngle, point); // 旋转角度和平移
huabug.Transform = mtxRotate;
huabug.DrawString(sideItem.FontString, font, sbrush, point, format);
}
}
}
string printMapPath = _webHelper.MapPath(_filePath);
if (!System.IO.Directory.Exists(printMapPath))
{
System.IO.Directory.CreateDirectory(printMapPath);
}
var printFileName = pp.DiyItemTemplateName + "diy_" + Guid.NewGuid().ToString().ToLower().Replace("-", "") + ".png";
var printPicUrl = "/Content/Uploads/Images/PrintImage/" + DateTime.Now.ToString("yyyyMM") + "/" + printFileName;
bitmap.Save(_webHelper.MapPath(printPicUrl));
pp.PrintImageUrl = printPicUrl;
#endregion
//productPictureService.UpdateProductPicture(pp);
}
}
productService.UpdateProduct(product);
}
}
}
Nopcommerce 使用Task时dbcontext关闭问题的更多相关文章
- Activity has leaked window that was originally added -界面退出时未关闭对话框异常 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? -
退出Activity时弹出登录框,点击确定finish当前Activity,结果报了这个错,随后查找资料知道 原因: 是因为退出Activity时没有关闭弹出框,出现了这个错误 解决方法: 只需要在a ...
- C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别
C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye { //私有的构造函数,保证外部不能实例化 private ...
- jq自定义下拉菜单,在点击非当前下拉菜单区域时,关闭下拉菜单(点击事件的对象不是目标元素本身)
jq自定义下拉菜单,在点击非当前下拉菜单区域时,关闭下拉菜单(点击事件的对象不是目标元素本身) //点击非当前下拉菜单区域时,关闭下拉菜单 $(document).mousedown(function ...
- ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 时 Session 关闭问题
一.问题描述 在向ASP.NET MVC中整合NHibernate.Spring.NET后,如下管理员与角色关系: 类public class Admin { public virtual strin ...
- RabbitMQ阻塞读取时数据时,关闭channel引起的问题和解决方案
项目场景: 最近在项目中使用了RabbitMq,其中有一个功能必须能随时切断RabbitMq的coumser.第一时间写出来的代码如下: 伪代码: while(flag){ QueueingConsu ...
- vs2017 调试时 浏览器关闭不想中断调试
解决方案 工具—>选项—>项目和解决方案—>web项目-->去点“浏览器窗口关闭时停止调试”前面的勾去掉>>>
- 删除vi编辑产生的.swp文件(linux编辑文件没有退出时直接关闭程序产生的临时文件)
关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个 ...
- 网站调试时记得关闭火狐adblock插件
由于特殊需要,xmyanke需要在网站右侧添加一个弹窗,第一个网站加上代码后可以正常显示,第二个网站却怎么也看不到图片,同样的安装方法为什么差别那么大呢?重新复制代码还是不行,再试一遍,依然如此,wi ...
- 开发时建议关闭chrome的缓存[Disable cache(while DevTools open)]
问题:修改了css,JS后,chrome看不到效果 具体情景:最近在写一个PHPbbs,在写CSS时,习惯性的按F5刷新,firefox ie等,都能即时见到效果,唯独chrome 怎么都不行,想了想 ...
随机推荐
- ArcGIS超级工具SPTOOLS-MXD操作篇
1.1 MXD批量裁剪 操作视频:https://weibo.com/tv/v/Hy7P6bF7d?fid=1034:4381332084881258 把当前窗口的MXD,按某个图层的某个字段批量裁 ...
- <JavaScript> 关于闭包和this对象
1.this指向windows是如何得出的 var name = "The Window"; var object = { name : "My Object" ...
- Android 显示系统:飞思卡尔平台图形界面与GPU硬件加速
图形是Android平台中的一个大主题,包含java/jni图形框架和2d/3d图形引擎(skia.OpenGL-ES.renderscript). 本文档描述了飞思卡尔设备上的一般Android图形 ...
- LevelListDrawable
用来管理一组Drawable的,我们可以为里面的drawable设置不同的level, 当他们绘制的时候,会根据level属性值获取对应的drawable绘制到画布上,根节点 为:<level- ...
- MR21修改标准价
转自:https://blog.csdn.net/qq_21813647/article/details/79195731 物料帐下只有物料的状态是初始状态才允许修改价格. 如果状态为已输入数量和值也 ...
- 递归-PrintDigit
static void PrintDigit(double n,int len,int count=-1) { if (n <0) { n = System.Math.Abs(n); Conso ...
- PHP实现发送模板消息(微信公众号版)
以下为开发步骤: 1.微信公众号为服务号且开通微信认证(其他类型账号不能发送) 2.ip白名单设置你的服务器ip(用于获取access_token) 3.网页授权你的域名(用于获取用户的openid) ...
- Thingsboard源码编译,小白新坑随笔
在Thingsboard源码编译过程中,遇见的问题总结: 1.Thingsboard Server UI 模块编译,无法执行“npm install ”:出现错误信息:Failed to execut ...
- 《剑指offer》树专题 (牛客10.25)
考察的知识点主要在于树的数据结构(BST,AVL).遍历方式(前序,中序,后序,层次).遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈.由于树本身就是一个递归定义的结构,所以在递归 ...
- arduino系列文章
arduino系列文章 1.Arduino基础入门篇-进入Arduino的世界 2.关于使用Arduino做开发的理解 3.详解Arduino Uno开发板的引脚分配图及定义(重要且基础) 4.Ard ...