Exemplo n.º 1
0
        private bool Node24HLimit(string node, int limit)
        {
            var       ts    = DateTime.Now - H24StartCountTime;
            NodeLimit model = null;

            //24小时请求量不能超过指定数量
            if (ts.TotalDays > 1)
            {
                Node24HTPS.Clear();
                H24StartCountTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
            }
            if (Node24HTPS.ContainsKey(node))
            {
                model = Node24HTPS[node];
                if (model.Count > (limit * 3) * ts.TotalHours)
                {
                    return(false);
                }
                model.Count++;
            }
            else
            {
                model       = new NodeLimit();
                model.Node  = node;
                model.Count = 1;
                Node24HTPS.TryAdd(node, model);
            }
            return(true);
        }
Exemplo n.º 2
0
        private void BuildDynamicScript(string script, out string errorMsg)
        {
            string typeName = Const.MethodTypeName;
            var    asm      = CreateAsmExecutor(script, out errorMsg);

            if (asm != null)
            {
                if (!_scriptTypeDict.ContainsKey(_scriptHash))
                {
                    var type = asm.GetType(typeName);
                    _scriptTypeDict.TryAdd(_scriptHash, type);
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Renders the layer
        /// </summary>
        /// <param name="graphics">Graphics object reference</param>
        /// <param name="map">Map which is rendered</param>
        public override void Render(Graphics graphics, MapViewport map)
        {
            if (!map.Size.IsEmpty && map.Size.Width > 0 && map.Size.Height > 0)
            {
                var bmp = new Bitmap(map.Size.Width, map.Size.Height, PixelFormat.Format32bppArgb);

                using (var g = Graphics.FromImage(bmp))
                {
                    g.InterpolationMode = InterpolationMode;
                    g.Transform         = graphics.Transform.Clone();

                    var extent = new Extent(map.Envelope.MinX, map.Envelope.MinY,
                                            map.Envelope.MaxX, map.Envelope.MaxY);
                    var level      = BruTile.Utilities.GetNearestLevel(_source.Schema.Resolutions, Math.Max(map.PixelWidth, map.PixelHeight));
                    var tiles      = new List <TileInfo>(_source.Schema.GetTileInfos(extent, level));
                    var tileWidth  = _source.Schema.GetTileWidth(level);
                    var tileHeight = _source.Schema.GetTileWidth(level);

                    IList <WaitHandle> waitHandles = new List <WaitHandle>();
                    var toRender       = new System.Collections.Concurrent.ConcurrentDictionary <TileIndex, Bitmap>();
                    var takenFromCache = new System.Collections.Concurrent.ConcurrentDictionary <TileIndex, bool>();
                    foreach (TileInfo info in tiles)
                    {
                        var image = _bitmaps.Find(info.Index);
                        if (image != null)
                        {
                            toRender.TryAdd(info.Index, image);
                            takenFromCache.TryAdd(info.Index, true);
                            continue;
                        }
                        if (_fileCache != null && _fileCache.Exists(info.Index))
                        {
                            var tileBitmap = GetImageFromFileCache(info) as Bitmap;
                            _bitmaps.Add(info.Index, tileBitmap);
                            toRender.TryAdd(info.Index, tileBitmap);
                            takenFromCache.TryAdd(info.Index, true);
                            continue;
                        }

                        var waitHandle = new AutoResetEvent(false);
                        waitHandles.Add(waitHandle);
                        ThreadPool.QueueUserWorkItem(GetTileOnThread,
                                                     new object[] { _source, info, toRender, waitHandle, true, takenFromCache });
                    }

                    foreach (var handle in waitHandles)
                    {
                        handle.WaitOne();
                    }

                    using (var ia = new ImageAttributes())
                    {
                        if (!_transparentColor.IsEmpty)
                        {
                            ia.SetColorKey(_transparentColor, _transparentColor);
                        }
#if !PocketPC
                        ia.SetWrapMode(WrapMode.TileFlipXY);
#endif

                        foreach (var info in tiles)
                        {
                            if (!toRender.ContainsKey(info.Index))
                            {
                                continue;
                            }

                            var bitmap = toRender[info.Index];//_bitmaps.Find(info.Index);
                            if (bitmap == null)
                            {
                                continue;
                            }

                            var min = map.WorldToImage(new Coordinate(info.Extent.MinX, info.Extent.MinY));
                            var max = map.WorldToImage(new Coordinate(info.Extent.MaxX, info.Extent.MaxY));

                            min = new PointF((float)Math.Round(min.X), (float)Math.Round(min.Y));
                            max = new PointF((float)Math.Round(max.X), (float)Math.Round(max.Y));

                            try
                            {
                                g.DrawImage(bitmap,
                                            new Rectangle((int)min.X, (int)max.Y, (int)(max.X - min.X),
                                                          (int)(min.Y - max.Y)),
                                            0, 0, tileWidth, tileHeight,
                                            GraphicsUnit.Pixel,
                                            ia);
                            }
                            catch (Exception ee)
                            {
                                Logger.Error(ee.Message);
                            }
                        }
                    }

                    //Add rendered tiles to cache
                    foreach (var kvp in toRender)
                    {
                        if (takenFromCache.ContainsKey(kvp.Key) && !takenFromCache[kvp.Key])
                        {
                            _bitmaps.Add(kvp.Key, kvp.Value);
                        }
                    }

                    graphics.Transform = new Matrix();
                    graphics.DrawImageUnscaled(bmp, 0, 0);
                    graphics.Transform = g.Transform;
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Renders the layer
        /// </summary>
        /// <param name="graphics">Graphics object reference</param>
        /// <param name="map">Map which is rendered</param>
        public override void Render(Graphics graphics, Map map)
        {
            if (!map.Size.IsEmpty && map.Size.Width > 0 && map.Size.Height > 0)
            {
                var bmp = new Bitmap(map.Size.Width, map.Size.Height, PixelFormat.Format32bppArgb);
                
                using (var g = Graphics.FromImage(bmp))
                {
                    g.InterpolationMode = InterpolationMode;
                    g.Transform = graphics.Transform.Clone();

                    var extent = new Extent(map.Envelope.MinX, map.Envelope.MinY, 
                                            map.Envelope.MaxX, map.Envelope.MaxY);
                    var level = BruTile.Utilities.GetNearestLevel(_source.Schema.Resolutions, map.PixelSize);
                    var tiles = new List<TileInfo>(_source.Schema.GetTileInfos(extent, level));
                    var tileWidth = _source.Schema.GetTileWidth(level);
                    var tileHeight = _source.Schema.GetTileWidth(level);

                    IList<WaitHandle> waitHandles = new List<WaitHandle>();
                    var toRender = new System.Collections.Concurrent.ConcurrentDictionary<TileIndex, Bitmap>();
                    var takenFromCache = new System.Collections.Concurrent.ConcurrentDictionary<TileIndex,bool>();
                    foreach (TileInfo info in tiles)
                    {
                        var image = _bitmaps.Find(info.Index);
                        if (image != null)
                        {
                            toRender.TryAdd(info.Index, image);
                            takenFromCache.TryAdd(info.Index,true);
                            continue;
                        }
                        if (_fileCache != null && _fileCache.Exists(info.Index))
                        {
                            var tileBitmap = GetImageFromFileCache(info) as Bitmap;
                            _bitmaps.Add(info.Index, tileBitmap);
                            toRender.TryAdd(info.Index, tileBitmap);
                            takenFromCache.TryAdd(info.Index, true);
                            continue;
                        }

                        var waitHandle = new AutoResetEvent(false);
                        waitHandles.Add(waitHandle);
                        ThreadPool.QueueUserWorkItem(GetTileOnThread,
                                                     new object[] { _source, info, toRender, waitHandle, true, takenFromCache });
                    }

                    foreach (var handle in waitHandles)
                        handle.WaitOne();

                    using (var ia = new ImageAttributes())
                    {
                        if (!_transparentColor.IsEmpty)
                            ia.SetColorKey(_transparentColor, _transparentColor);
#if !PocketPC
                        ia.SetWrapMode(WrapMode.TileFlipXY);
#endif

                        foreach (var info in tiles)
                        {
                            if (!toRender.ContainsKey(info.Index))
                                continue;

                            var bitmap = toRender[info.Index];//_bitmaps.Find(info.Index);
                            if (bitmap == null) continue;

                            var min = map.WorldToImage(new Coordinate(info.Extent.MinX, info.Extent.MinY));
                            var max = map.WorldToImage(new Coordinate(info.Extent.MaxX, info.Extent.MaxY));

                            min = new PointF((float) Math.Round(min.X), (float) Math.Round(min.Y));
                            max = new PointF((float) Math.Round(max.X), (float) Math.Round(max.Y));

                            try
                            {
                                g.DrawImage(bitmap,
                                            new Rectangle((int) min.X, (int) max.Y, (int) (max.X - min.X),
                                                          (int) (min.Y - max.Y)),
                                            0, 0, tileWidth, tileHeight,
                                            GraphicsUnit.Pixel,
                                            ia);
                            }
                            catch (Exception ee)
                            {
                                Logger.Error(ee.Message);
                            }

                        }
                    }

                    //Add rendered tiles to cache
                    foreach (var kvp in toRender)
                    {
                        if (takenFromCache.ContainsKey(kvp.Key) && !takenFromCache[kvp.Key])
                        {
                            _bitmaps.Add(kvp.Key, kvp.Value);
                        }
                    }

                    graphics.Transform = new Matrix();
                    graphics.DrawImageUnscaled(bmp, 0, 0);
                    graphics.Transform = g.Transform;
                }
            }
        }
Exemplo n.º 5
0
        public void UpdateRecord(RecordType recordType, string sign)
        {
            //得到枚举选项
            List <RecordType> result = EnumExtendMethod.GetEnumArray <RecordType>(recordType);

            decimal d;

            if (result.Count > 0)
            {
                switch (result[0])
                {
                case RecordType.Page:
                    Func <TygModel.文章表, bool> fun = null;
                    //如果是数据ID
                    if (decimal.TryParse(sign, out d))
                    {
                        fun = p => p.ID == d;
                    }
                    else
                    {
                        fun = p => p.GUID == Guid.Parse(sign);
                    }

                    //得到对应的记录
                    var records = tygdb.文章表.Where(fun);

                    //初始化当前访问的页面
                    TabPageEntity page = null;

                    if (records.Count() > 0)
                    {
                        var record = records.FirstOrDefault();

                        #region 初始化页面对象数据
                        //如果当前缓存记录中存在这条记录
                        if (!BooksCache.ContainsKey(record.书名表.GUID.ToString()))
                        {
                            //页面所在的分类
                            TabClassEntity Typeclass = null;
                            //如果包括分类
                            if (ClassesCache.ContainsKey(record.书名表.分类表.ID))
                            {
                                Typeclass = ClassesCache[record.书名表.分类表.ID];
                            }
                            else
                            {
                                Typeclass = new TabClassEntity()
                                {
                                    Modifyd = true,
                                };
                                Typeclass.Record = record.书名表.分类表;


                                //添加到分类表
                                ClassesCache.TryAdd(Typeclass.Record.ID, Typeclass);
                            }
                            //实例化书对像
                            TabBookEntity book = new TabBookEntity()
                            {
                                Record    = record.书名表,
                                Typeclass = Typeclass,
                                Modifyd   = true,
                            };

                            //尝试添加到数据中
                            ClassesCache[record.书名表.分类表.ID].Books.TryAdd(record.书名表.GUID.ToString(), book);


                            //如果不包含
                            if (!book.Pages.ContainsKey(sign))
                            {
                                page = new TabPageEntity()
                                {
                                    Book    = book,
                                    Issync  = false,
                                    Modifyd = true,
                                    Record  = record
                                };

                                //将页面添加到缓存集合
                                book.Pages.TryAdd(record.本记录GUID.ToString(), page);
                            }
                            //添加到书的缓存集合
                            BooksCache.TryAdd(record.书名表.GUID.ToString(), book);
                        }
                        #endregion

                        //得到书本对象的数据
                        page = BooksCache[record.书名表.GUID.ToString()].Pages[record.本记录GUID.ToString()];
                        page.Record.总访问次数++;
                        page.Record.最后访问时间 = DateTime.Now;
                        page.Record.书名表.总点击++;
                        page.Record.书名表.周点击++;
                    }

                    break;

                case RecordType.Book:

                    Func <TygModel.书名表, bool> bookfun = null;
                    //如果是数据ID
                    if (decimal.TryParse(sign, out d))
                    {
                        bookfun = p => p.ID == d;
                    }
                    else
                    {
                        bookfun = p => p.GUID == Guid.Parse(sign);
                    }
                    //得到对应的记录
                    var bookrecords = tygdb.书名表.Where(bookfun);
                    if (bookrecords.Count() > 0)
                    {
                        var record = bookrecords.FirstOrDefault();
                        #region 初始化页面对象数据
                        //如果当前缓存记录中存在这条记录
                        if (!BooksCache.ContainsKey(record.GUID.ToString()))
                        {
                            //页面所在的分类
                            TabClassEntity Typeclass = null;
                            //如果包括分类
                            if (ClassesCache.ContainsKey(record.分类表.ID))
                            {
                                Typeclass = ClassesCache[record.分类表.ID];
                            }
                            else
                            {
                                Typeclass = new TabClassEntity()
                                {
                                    Modifyd = true,
                                };
                                Typeclass.Record = record.分类表;

                                //添加到分类表
                                ClassesCache.TryAdd(Typeclass.Record.ID, Typeclass);
                            }
                            //实例化书对像
                            TabBookEntity book = new TabBookEntity()
                            {
                                Record    = record,
                                Typeclass = Typeclass,
                                Modifyd   = true,
                            };
                            BooksCache.TryAdd(record.GUID.ToString(), book);
                        }
                        //更新状态
                        BooksCache[record.GUID.ToString()].Modifyd = true;

                        #endregion
                        record.总点击++;
                        record.周点击++;
                    }


                    break;

                case RecordType.ClassEntity:

                    break;
                }
            }

            #region 查看记录不是不和缓存数据中的记录相等 如果不相当则更新较旧的记录

            #endregion
        }