2015-09-04 9 views
4
public void screenShot(string path) 
    { 
     var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
             Screen.PrimaryScreen.Bounds.Height, 
             PixelFormat.Format32bppArgb); 

     var gfxScreenshot = Graphics.FromImage(bmpScreenshot); 
     gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, 
            Screen.PrimaryScreen.Bounds.Y, 
            0, 
            0, 
            Screen.PrimaryScreen.Bounds.Size, 
            CopyPixelOperation.SourceCopy); 

     bmpScreenshot.Save(path, ImageFormat.Png); 
    } 

Я использовал этот код для захвата экрана моего компьютера.Что произойдет, если я не вызываю dispose()?

Но сегодня я узнал, что существует метод Bitmap.Dispose().

В чем разница между вызовом Dispose() или нет? Это важно для запуска кода?

+2

http://www.devx.com/dotnet/Article/33167 – wudzik

+0

читать о "сборщика мусора" – Arash

+0

https://msdn.microsoft.com/en-us/library/fs2xkftw%28v=vs. 110% 29.aspx? F = 255 & MSPPError = -2147217396 –

ответ

2

Обязательно необходимо позвонить по телефону Dispose. Если вы этого не сделаете, есть неуправляемые ресурсы, такие как объекты GDI, которые не будут очищены. Это означает, что у вас будет утечка памяти.

Так что да, позвоните по телефону Dispose (или лучше, используйте using (...) { ... }).

+0

Вызывает 'Dispose()' или использует 'используя (...) {...}' то же самое? –

+2

@ArthurPark Да, они строго эквивалентны. См. Http://stackoverflow.com/questions/10984336/net-using-using-blocks-vs-calling-dispose. Это говорит о том, что 'use' лучше, поскольку он уже реализует шаблон try/finally, поэтому он гарантирует, что объект даже если есть какое-то исключение. – ken2k

0

В основном ваш код должен выглядеть следующим образом

public void screenShot(string path) 
{ 
    using (var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
            Screen.PrimaryScreen.Bounds.Height, 
            PixelFormat.Format32bppArgb)) 

    { 
     var gfxScreenshot = Graphics.FromImage(bmpScreenshot); 
     gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, 
           Screen.PrimaryScreen.Bounds.Y, 
           0, 
           0, 
           Screen.PrimaryScreen.Bounds.Size, 
           CopyPixelOperation.SourceCopy); 

     bmpScreenshot.Save(path, ImageFormat.Png); 
    } 
} 

Это обеспечивает неуправляемые ресурсы, используемые объектом растровый правильно освобождены. С одной растровой картиной вы не столкнетесь с серьезными проблемами, если не будете правильно утилизироваться, но как только вы начнете массовую обработку, она становится критической. Неправильное удаление из-за проблем с памятью, я видел, как память заполняется очень быстро с неправильным кодированием.

+0

Извините, мы отправили наши ответы одновременно. Это правильный ответ, я удалю мою. –

0

Метод «Утилизировать» происходит от интерфейса «IDisposable» и выполняет следующие функции:

Выполняет определяемые приложением задачи, связанные с освободив, высвобождая, или сбросом неуправляемых ресурсов.

В принципе вы можете сказать, что используемые ресурсы не освобождаются немедленно. Даже когда они больше не нужны. Но только тогда, когда сборщик мусора отпускает их.

Для получения дополнительной информации ознакомьтесь с MSDN: IDisposable Interface

Другие полезные ссылки по этой теме:

6

Если тип реализует интерфейс IDisposable, вы обязательно должны называть Dispose (либо явно, либо блоком using).

Что произойдет, если я не вызываю dispose()?

Если вы этого не сделаете, деструктор (финализатор) несет ответственность за освобождение ресурсов; однако он имеет некоторые недостатки:

  • Не детерминирован: финализаторы выполняются GC по выделенной теме. GC решает, когда их запускать. Если ссылка хранится в объекте (например, в главном окне приложения), возможно, что финализатор не будет выполнен до выхода из приложения.
  • Накладные расходы: если финализатор не подавлен, GC имеет некоторые проблемы с объектами для уничтожения.
  • Опасно: если финализатор выдает исключение, он считается фатальным и приведет к сбою всего приложения.