Nopcommerce 使用Task时dbcontext关闭问题
Posted 很久很久以前
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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关闭问题的主要内容,如果未能解决你的问题,请参考以下文章