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 怎么都不行,想了想 ...
随机推荐
- 重读APUE(7)-link/unlink与mkdir/rmdir
link–用于创建一个现有文件的链接:实际上是新建一个目录项,指向当前文件的i节点: unlink–用于删除一个现有文件的连接:实际上是对引用i节点的目录项进行删除,并且对链接计数-1:系统会检查文件 ...
- [Oracle]关于回滚段的一些转贴摘录
ORACLE 回滚段 回滚段概述 回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段 ...
- otter安装、使用
一.otter简介 otter是阿里开源的一个分布式数据库同步系统,尤其是在跨机房数据库同步方面,有很强大的功能.它是基于数据库增量日志解析,实时将数据同步到本机房或跨机房的mysql/oracle数 ...
- WebService技术规则
1.基于web的系统级接口规范 - 一个普通适用标准 :http+xml - 任何网络通信的操作系统 - 自包含.自描述.模块化 - 发布.定位.通过web调用 2. ...
- LSTM_Model
#!/usr/bin/python# -*- coding: utf-8 -*- import tensorflow as tf class TRNNConfig(object): "&qu ...
- unittest-每个模块用例一条一条跑,模块都合在一个表格里面统计的方法
文件目录 文件里面的结构就是常规的 unittest框架的写法 总执行文件 # #coding=utf-8 import unittest, time, os, multiprocessingimpo ...
- protobuf / Consul / 边缘计算 / MEC / CDN / Serverless / GraphQL / 微服务 / 网关 / 云原生 / Serverless (真能造概念啊!!!)
技术概念层出不穷,学吧!记录下自己多这些概念的理解 protobuf: 数据结构而已,类比XML, JSON consul 解决的只是微服务里的服务注册与发现,健康检查等. 边缘计算:可以理解为是指利 ...
- SpringBoot: 14.异常处理方式4(使用SimpleMappingExceptionResolver处理异常)(转)
修改异常处理方法3中的全局异常处理Controller即可 package bjsxt.exception; import org.springframework.context.annotation ...
- 阿里巴巴java规则p3c结合sonar使用
sonar插件位置: jar包放至$SONAR_HOME/extensions/plugins下,重启sonar即可 如何在sonarqube的pmd插件中整合阿里开发规范 alibaba p3c s ...
- FTP服务器搭建基础工具:Serv-U 14.0.2使用教程
安装教程 1.在本站下载好压缩包,将文件解压,双击运行“ServUSetup官方原版程序.exe”程序,弹出语言选择框,选择“中文(简体)”,点击“确定”开始安装 2.点击“下一步”进行安装 ...