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关闭问题的更多相关文章

  1. 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 ...

  2. C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别

    C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye    { //私有的构造函数,保证外部不能实例化        private  ...

  3. jq自定义下拉菜单,在点击非当前下拉菜单区域时,关闭下拉菜单(点击事件的对象不是目标元素本身)

    jq自定义下拉菜单,在点击非当前下拉菜单区域时,关闭下拉菜单(点击事件的对象不是目标元素本身) //点击非当前下拉菜单区域时,关闭下拉菜单 $(document).mousedown(function ...

  4. ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 时 Session 关闭问题

    一.问题描述 在向ASP.NET MVC中整合NHibernate.Spring.NET后,如下管理员与角色关系: 类public class Admin { public virtual strin ...

  5. RabbitMQ阻塞读取时数据时,关闭channel引起的问题和解决方案

    项目场景: 最近在项目中使用了RabbitMq,其中有一个功能必须能随时切断RabbitMq的coumser.第一时间写出来的代码如下: 伪代码: while(flag){ QueueingConsu ...

  6. vs2017 调试时 浏览器关闭不想中断调试

    解决方案 工具—>选项—>项目和解决方案—>web项目-->去点“浏览器窗口关闭时停止调试”前面的勾去掉>>>

  7. 删除vi编辑产生的.swp文件(linux编辑文件没有退出时直接关闭程序产生的临时文件)

    关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个 ...

  8. 网站调试时记得关闭火狐adblock插件

    由于特殊需要,xmyanke需要在网站右侧添加一个弹窗,第一个网站加上代码后可以正常显示,第二个网站却怎么也看不到图片,同样的安装方法为什么差别那么大呢?重新复制代码还是不行,再试一遍,依然如此,wi ...

  9. 开发时建议关闭chrome的缓存[Disable cache(while DevTools open)]

    问题:修改了css,JS后,chrome看不到效果 具体情景:最近在写一个PHPbbs,在写CSS时,习惯性的按F5刷新,firefox ie等,都能即时见到效果,唯独chrome 怎么都不行,想了想 ...

随机推荐

  1. HRNET网络结构简单分析

    hrnet相关的两篇文章 CVPR2019   Deep High-Resolution Representation Learning for Human Pose Estimation High- ...

  2. git如何将一个远程仓库的某个分支拉取到当前分支?

    答: git pull <remote_repository_url> <branch_name> 例如: git clone https://github.com/lede- ...

  3. vim 快捷键 清空文件所有内容

    vim清空文件所有内容 在使用vim编辑器的时候,有时候编辑一个文件,而文件内容比较多,如果需要快速清空整个文件,可以使用一下命令: 在命令模式下,首先执行 gg 这里是跳至文件首行 再执行: dG ...

  4. 安卓 通过intent调用系统文件管理器打开指定路径目录

    安卓 通过intent调用系统文件管理器打开指定路径目录     转  https://blog.csdn.net/qq_34161388/article/details/78586247 当我们知道 ...

  5. Linux 全盘搜索关键字

    grep  -Ern  -o  '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25 ...

  6. 目标检测-Cascade-RCNN

    转载:https://zhuanlan.zhihu.com/p/36095768 Cascade R-CNN: Delving into High Quality Object Detection 论 ...

  7. Python描述性统计numpy

    import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import datasets, ...

  8. TreeView如何实现选中的节点上移或下移 [问题点数:20分,结帖人nww2002]

    在TreeView中,如何实现选中一节点,右键点击上移或下移 TTreeNode.MoveTo() 一.获得Tree上的结点var NowNode : TTreeNode;begin  NowNode ...

  9. Linux学习笔记:vim

    目录 模式 命令模式 编辑模式 底行模式 .vimrc .viminfo .swap 本文更新于2019-09-05. 说明:下文中,使用{}引起表示自定义变量,根据实际情况填写.使用[]引起表示内容 ...

  10. nrpe command

    1. nrpe 连接问题: 报错:/usr/local/nagios/libexec/check_nrpe  -H  destip   ;   CHECK_NRPE: Error - Could no ...