VS.Net paketlerinde SolutionEvents’i dinlemek

    Yazdığım Visual Studio eklentilerinden birisinde uygulamanın kapanmasını dinleyerek, bazen Visual Studio’nun kapanmasını iptal etmem gekiyordu. Teorik olarak yapılması gereken kolaydı, SolutionEvents’in içerisinde bulunan QueryCloseSolution olayını dinleyerek bu olay olduğunda ilgili iş mantığı kodunu işletecek ve fCancel değişkenine true veya false şeklinde gerekli boolean değeri atayacaktım; öylede yaptım. Kodu derleyip çalıştırdığımda o zamanlar anlayamadığım bir şekilde zaman zaman tam istediğim gibi çalışırken bazen de hiç bir şekilde çalışmıyordu. Fazla üzerinde duramadığım bu hata kafamı yine de kurcalamaya devam ediyordu.

  void Initialize() {
   DTE dte = (DTE)serviceProvider.GetService(typeof(DTE));
   EnvDTE.SolutionEvents solutionEvents = dte.Events.SolutionEvents;
   solutionEvents.QueryCloseSolution += new EnvDTE._dispSolutionEvents_QueryCloseSolutionEventHandler(SolutionEvents_QueryCloseSolution);
  }

  void SolutionEvents_QueryCloseSolution(ref bool fCancel) {
    fCancel = <İş mantığı sonucu burda iptal edilebilir ya da kapanmaya izin verilebilir>;
  }

    Yanıt aslında basitmiş; burda SolutionEvents, Initialize fonksiyonu içerisinde çıkıldığında otomatik olarak silinmek üzere işaretleniyor ve bir süre sonra da Garbage Collector tarafından hafızadan tamamen atılıyormuş. Dolayısıyla da bir süre sonra biz SolutionEvents üzerindeki hiç bir olayı dinleyemiyoruz. Bu durumda yapılması gereken ise; bunu fonksiyon içerisindeki değişkende tutmak yerine sınıf’a taşıyorak Garbage Collector tarafında hafızadan atılmasını engellemekten ibaret.

 private EnvDTE.SolutionEvents solutionEvents;

 void Initialize() {
  DTE dte = (DTE)serviceProvider.GetService(typeof(DTE));
  solutionEvents = dte.Events.SolutionEvents;
  solutionEvents.QueryCloseSolution += new EnvDTE._dispSolutionEvents_QueryCloseSolutionEventHandler(SolutionEvents_QueryCloseSolution);
 }

 void SolutionEvents_QueryCloseSolution(ref bool fCancel) {
   fCancel = <İş mantığı sonucu burda iptal edilebilir ya da kapanmaya izin verilebilir>;
 }

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir