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 怎么都不行,想了想 ...
随机推荐
- Leetcode题目337:打家劫舍 III(树形DP-中等)
题目描述: 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为“根”. 除了“根”之外,每栋房子有且只有一个“父“房子与之相连.一番侦察之后,聪明 ...
- 黑马vue---46、vue使用过渡类名实现动画
黑马vue---46.vue使用过渡类名实现动画 一.总结 一句话总结: vue动画的过渡类名的时间点中没有设置样式的话就是默认的样式 使用 transition 元素,把 需要被动画控制的元素,包裹 ...
- Csdn账号如何注销?
Csdn账号如何注销? 请在ios端app设置内注销 ios端注销在设置页面的底部左下角,andriod在2019.07月底更新,即可支持 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎 ...
- 循环引擎 greenlet 没有显式调度的微线程,换言之 协程
小结: 1. micro-thread with no implicit scheduling; coroutines, in other words. 没有显式调度的微线程,换言之 协程 2. 一个 ...
- django 2.2和mysql使用的常见问题
可能是由于Django使用的MySQLdb库对Python3不支持,我们用采用了PyMySQL库来代替,导致出现各种坑,特别是执行以下2条命令的是时候: python manage.py makemi ...
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_3.RabbitMQ研究-工作原理
Producer生产者 Consumer:消费者 组成部分说明如下: Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue. Exchange:消息队列交换机,按一定的规则 ...
- tmpfs使用完毕导致数据库无法正常工作
df -h 查看 重新启动服务器就可以了
- 怎么理解linux的平均负载及平均负载高后的排查工具
什么是平均负载 平均负载可以对于我们来说及熟悉又陌生,但我们问平均负载是什么,但大部分人都回答说平均负载不就是单位时间内CPU使用率吗?其实并不是这样的,如果可以的话,可以 man uptime 来了 ...
- Block的示例学习
@interface ViewController () @property (weak, nonatomic) IBOutlet UIButton *btn; - (IBAction)reset:( ...
- Android之View的内容
View的事件体系 本章介绍View的事件分发和滑动冲突问题的解决方案. 3.1 view的基础知识 View的位置参数.MotionEvent和TouchSlop对象.VelocityTracker ...