Bitmap и picturebox вызывают исключение из памяти

Я пытаюсь создать приложение, которое показывает онлайн-поезда в picturebox.

но мое приложение тратит много памяти, и иногда я получаю Out of memory exception, а иногда мои поезда Disappears из picturebox. Чтобы нарисовать онлайн-поезд в первый раз, я рисую карту поездов (линии, станции,...) на picturebox с размером x=A и y=b, после чего я создаю еще один picturebox с таким же размером и помещаю второй picturebox на первый picturebox, используя этот код:

    pictureBoxonlineTrain.Parent = pictureBoxMetroMap;

In every second the below function is executed :

       public void DrawOnlineTrain()
            {
                Bitmap map=null;
                if (OnlineTrainList.Count > 0)
                {
                    map = new Bitmap(pictureBoxonlineTrain.Size.Width, pictureBoxonlineTrain.Size.Height);

                    var graph = Graphics.FromImage(map);

                    foreach (TimeTable t in OnlineTrainList.ToList())
                    {
                       // graph.Dispose();
                        Rectangle rectTrainState = new Rectangle(t.XTrainLocation.Value - 3,
                                                                 t.YTrainLocation.Value - 3,
                                                                 15, 15);
                        graph.FillRectangle(RedBrush, rectTrainState);
                        graph.DrawString(t.TrainId.ToString(), pictureBoxonlineTrain.Font, Brushes.White, t.XTrainLocation.Value  -3, t.YTrainLocation.Value -3);

                    }
                }
                pictureBoxonlineTrain.Image = map;
              //  pictureBoxonlineTrain.Image.Save(@"C:\RailwayShiraz\ShirazMetro\ShirazRailWayWeb\Images\Train.jpg");
            } 

И я думаю, что это причина моего исключения памяти, потому что каждый раз, когда я создаю объект bitmap и graphic. Мой вопрос: как я могу изменить этот код, поскольку объекты размещаются в каждом цикле?


person Ehsan Akbar    schedule 06.07.2014    source источник
comment
подробности кода: stackoverflow.com/questions/24589544/   -  person Ehsan Akbar    schedule 06.07.2014
comment
I am trying to create an application that shows the online trains in picturebox - как всегда, я настоятельно рекомендую вам отказаться от архаичных winforms и использовать правильная технология вместо этого. У вас не будет ни одной из этих проблем, так как, скорее всего, вы просто пытаетесь добиться минимального движения в пользовательском интерфейсе, для которого winforms не подходит. См. Мой пример о том, как легко добиться динамического позиционирования/перемещения элементов пользовательского интерфейса на основе данных с использованием текущей технологии пользовательского интерфейса .Net. .   -  person Federico Berasategui    schedule 06.07.2014
comment
Это отличная идея, но у меня нет времени, чтобы изменить свое приложение на wpf. Это отнимает много времени?   -  person Ehsan Akbar    schedule 06.07.2014
comment
Это зависит от того, чего вы действительно пытаетесь достичь. Поместить несколько линий/прямоугольников/что угодно и перемещать их по экрану легко, как 1,2,3 в WPF и не требует каких-либо ужасных хаков, которые вы сейчас используете на winforms. Смотрите мой пример. Я только что загрузил полный исходный код на GitHub. Убедитесь, что вы нажимаете «Комментарии» при запуске приложения.   -  person Federico Berasategui    schedule 06.07.2014
comment
также взгляните на код, чтобы увидеть, как легко просто связать позиции элементов пользовательского интерфейса на холсте с парой свойств в соответствующей модели представления/модели данных. Это означает, что просто обновляя свойства новыми данными, вы получаете WPF для бесплатного обновления пользовательского интерфейса. Никаких ужасных взломов, никакого процедурного кода. Просто простые свойства и DataBinding.   -  person Federico Berasategui    schedule 06.07.2014
comment
Ладно, я сейчас посплю. Если вам интересен этот код, вы также можете посмотреть Мой другой пример, который в основном такой же, но включает более сложные объекты и логика. В противном случае, я буду рядом завтра, если вам нужна дополнительная помощь;)   -  person Federico Berasategui    schedule 06.07.2014
comment
@HighCore спасибо, дорогой друг. спасибо за помощь   -  person Ehsan Akbar    schedule 06.07.2014


Ответы (1)


поместите растровое изображение и графику в оператор Using, и он будет удален

using (map = new Bitmap(pictureBoxonlineTrain.Size.Width, pictureBoxonlineTrain.Size.Height))
{
    using (Graphics graph = Graphics.FromImage(map))
    {
//code goes here
    }
}
person Chase Rocker    schedule 06.07.2014
comment
Спасибо, но в этом ((карта = новое растровое изображение (pictureBoxonlineTrain.Size.Width, pictureBoxonlineTrain.Size.Height))) я получил этот параметр ошибки недопустимым !!! - person Ehsan Akbar; 06.07.2014
comment
перед использованием «оператора использования» я получил эту ошибку: stackoverflow.com/questions/24589544/ - person Ehsan Akbar; 06.07.2014
comment
если вы используете оператор «Использование», убедитесь, что вы удалили «Bitmap map=null;» - person Chase Rocker; 06.07.2014
comment
Спасибо, я этого не вижу - person Ehsan Akbar; 06.07.2014