2014-10-11 20 views
0

爲什麼我得到這個「的System.OutOfMemoryException的System.OutOfMemoryException而執行了一個小時

這個代碼是提供的服務來讀取智能卡讀卡器的智能卡,並把結果文本框,這是焦點中的任何後應用。當它運行(超過60分鐘)我得到錯誤拋出。我的情況發生了什麼?

請指教

class Program 
    { 
     static bool infinity = true; 
     static WinSCard sCard; 

     public static void Main(string[] args) 
     { 
      try 
      { 
       sCard = new WinSCard(); 

       while (infinity) { 

        sCard.EstablishContext();     //establis smart card reader resourete manager 
        sCard.ListReaders();      //get list of smart card reader 

        string readerName = sCard.ReaderNames[0]; //the first smart card reader in the list 

        sCard.WaitForCardPresent(readerName);  //block execution until smart card was attached to the reader 
        sCard.Connect(readerName);     //connect to a smart card 

//     Console.WriteLine("ATR: 0x" + sCard.AtrString); 


        byte[] cmdApdu = { 0xFF, 0xCA, 0x00, 0x00, 00 }; // get card UID ... 
        byte[] respApdu = new byte[6]; 
        int respLength = respApdu.Length; 

        //submit command to smart card and get a return result 
        sCard.Transmit(cmdApdu, cmdApdu.Length, respApdu, ref respLength); 

        //Convert Bute[] to HexString and finally Integer 
        int num = Int32.Parse(ByteArrayToString(respApdu, respLength), System.Globalization.NumberStyles.HexNumber); 
        Console.WriteLine("GET CARD UID ==> " + num); 

        //Send Result to any input that currently got focus 
        SendKeys.SendWait(num.ToString()); 

        sCard.WaitForCardRemoval(readerName); //block execution until smart card was removed to the reader 
        sCard.Disconnect();      //terminated connection to a smart card 
        sCard.ReleaseContext();     //freely any resource allocated under the context 
       } 
      } 
      catch (WinSCardException ex) 
      { 
       Console.WriteLine(ex.WinSCardFunctionName + " 0x" + ex.Status.ToString("X08") + " " + ex.Message); 
      } 
      finally 
      { 
       Console.WriteLine("Please press any key..."); 
       Console.ReadLine(); 
      } 
     } 

     public static string ByteArrayToString(byte[] ba, int length) 
     { 
      StringBuilder hex = new StringBuilder(length * 2); 
      foreach (byte b in ba) 
       hex.AppendFormat("{0:x2}", b); 
      return hex.ToString().Replace("9000",""); 
     } 
    } 
+0

這可能是非常有益的,如果你能提供到底是哪行拋出​​異常,和完整的stacktrace和這樣的東西! – AFract 2014-10-11 12:29:33

+0

我也想知道它,但sharpdevelop並沒有顯示哪個導致這個錯誤(對於這個錯誤) – 2014-10-11 12:33:18

+1

,你可以從發表的「評論」看到的答案 - 這個問題真的很難回答,因爲它是現在 - 沒有[方法]'東西確實不可能回答 - 只是嘗試一些隨機內存分析器,看看內存中的東西 - 最有可能的是一些事件處理程序,它可以避免GCed – Carsten 2014-10-11 12:43:19

回答

0

我的猜測是,sCard.ListReaders()會導致您的問題,所以我會在更多的細節有分析代碼。我假設有一些內部集合,它永遠不會被清理,你的sCard是靜態變量。您可以調試/寫入單元測試或使用內存分析工具,如ANTS Memory Profiler(創建初始快照,然後在10分鐘後比較哪個實例消耗內存)

+0

我會試試看。 Thx指出它 – 2014-10-11 12:27:12

1

您的代碼中是否有任何類實現IDisposable和你不是在處理它們,或者是它們的任何PInvoke調用,它們需要額外的調用來清除它們分配的任何內存。

0

它可以幫助您不要在您的循環中重用您的WinSCard對象。只需在每一個開始處創建一個新實例。 而且你不需要把這個對象放到一個靜態成員上,把它用作局部變量。

public static void Main(string[] args) 
    { 
     try 
     { 
      while (infinity) { 

       var sCard = new WinSCard(); 

       sCard.EstablishContext();     //establis smart card reader resourete manager 
       sCard.ListReaders();      //get list of smart card reader 

如果WinSCard工具IDisposable在using語句把它包起來,以確保以釋放潛在的不超過所使用的資源:

   using(var sCard = new WinSCard()) 
       { 
        sCard.EstablishContext();     //establis smart card reader resourete manager 
        sCard.ListReaders();      //get list of smart card reader 
+0

在我使用dotMemory(像ANTS Memory Profiler之類的工具)之後,內存沒有任何問題。並且我發現如果我通過open.exe啓動應用程序,而不是從sharpdevelop運行,則不存在內存泄漏問題。另一方面,如果我開始通過sharp開發運行內存繼續增加,那麼問題來自shapedevelop 5.0 RC? – 2014-10-12 08:17:11

+0

我不知道這是否是任何開發系統的問題。即使我不在乎。我的建議是一個基本的編程原則,我認爲不管開發系統或編程語言如何。原則上避免錯誤比在特殊情況下考慮失敗的原因更好 – abto 2014-10-12 09:21:00

相關問題