• 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);
                    }
                } 
            }
    

      

  • 相关阅读:
    指令
    linux学习之多高并发服务器篇(三)
    linux学习之高并发服务器篇(二)
    linux学习之多高并发服务器篇(一)
    Linux学习之socket编程(二)
    Linux学习之socket编程(一)
    myeclipse中如何修改Servlet模板_day01
    Properties的使用以及配置文件值的获取
    Sql_Server中如何判断表中某字段是否存在
    微博开发流程-01
  • 原文地址:https://www.cnblogs.com/ideacore/p/6510805.html
Copyright © 2020-2023  润新知