2017-03-17 151 views
6

並不總是,但現在,然後我不斷收到下面的錯誤,它不會影響我很多「我認爲」,但我想知道背後的原因以及我如何解決它。我已經嘗試disposing的背景,但我沒有看到任何改善。下面是我得到的錯誤日誌。這裏c#System.AccessViolationException:試圖讀取或寫入受保護的內存。

 3/16/2017 7:06:55 AM ERROR IN PLM data into file System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
    at System.Data.SqlServerCe.NativeMethods.CompileQueryPlan(IntPtr pQpCommand, String pwszCommandText, ResultSetOptions options, IntPtr[] pParamNames, IntPtr prgBinding, Int32 cDbBinding, IntPtr& pQpPlan, IntPtr pError) 
    at System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() 
    at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options) 
    at System.Data.Entity.SqlServerCompact.SqlCeMultiCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) 
    at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext) 
    at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 
    at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) 
    at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass3.<GetResults>b__1() 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() 
    at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() 
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
    at ILS.PLMOptimization.Algorithm.PLMOptimizationAlgorithm.Execute() 

代碼::

[HandleProcessCorruptedStateExceptions] 
     public bool Execute() 
     { 
      try 
      { 

       if (gridpst == true || gridpst == false) 
       { 
        //gridpst = false; enable this if you want griddg true or false. 

        if (ADRFlag == true) 
        { 
         MsgBox = "DR EVENT RUNNING! Please wait"; 
         Thread.Sleep(500); 
         MsgBox = null; 


        } 
        else if (ADRFlag == false) 
        { 
         // #region startPlm 

         int calc_plm_data = 0; 

         DateTime my_date = DateTime.Now; // get the present system time 
         int rem_min = my_date.Minute % 15; // get the round off system time interms of 15 mintues... 
         int rem_sec = my_date.Second % 60; 
         DateTime my_startTime = my_date.AddMinutes(-rem_min); 
         my_startTime = my_startTime.AddSeconds(-rem_sec); 
         DateTime my_stopTime = my_date.AddMinutes(5 - rem_min); 
         my_stopTime = my_stopTime.AddSeconds(-rem_sec); 

         if (present_plm_data.peakStartTime <= DateTime.MinValue || present_plm_data.peakStopTime >= DateTime.MaxValue) 
         { 
          // first time it is entering this loop. Hence check the present datetime and fetch record from the database... 
          calc_plm_data = 1; 
         } 
         else if (DateTime.Now > present_plm_data.present_StopTime || DateTime.Now < present_plm_data.present_StartTime) 
         { // present date and time are out of present peak data... so calculate a new peak data from the database 
          calc_plm_data = 1; 
         } 

         if (calc_plm_data == 1) 
         { 
          if (DbUpdateLoop.context.Database.Connection.State == System.Data.ConnectionState.Closed) 
           DbUpdateLoop.context.Database.Connection.Open(); 
          //fetch collection 
          using (var context = Context.Create("C:\\XSR_BIB_V2\\XSR_BIB_V2_DATABASE.sdf", "", 4091)) 
          { 
           if (DbUpdateLoop.context.Database.Connection.State == System.Data.ConnectionState.Closed) 
            DbUpdateLoop.context.Database.Connection.Open(); 

           try 
           { 

            var data = DbUpdateLoop.context.EnergyPeakInfo_Tbl.Where(x => (my_startTime >= x.StartTime) && (my_stopTime <= x.StopTime)).FirstOrDefault(); 



            if (data == null) 
            { 
             MsgBox = "No data available in DB"; 
             Thread.Sleep(500); 
             MsgBox = null; 


             // data is not retrieved from the database, either the data is not present or database access return error 
             // in this case, we need to get the data from the 
             return true; 
            } 

           // get the peak data from the energyinfo... 
           present_plm_data.present_StartTime = my_startTime; 
           present_plm_data.present_StopTime = my_stopTime; 
           present_plm_data.peakStartTime = data.StartTime; 
           present_plm_data.peakStopTime = data.StopTime; 
           present_plm_data.peakType = data.PeakType; 
           present_plm_data.price = data.PricePerKW; 
           present_plm_data.threshHold = data.PlmThreshold; 

           //calculate the threshold value from the data available in database. 
           var startTS = new TimeSpan(my_startTime.Hour, my_startTime.Minute, my_startTime.Second); 
           var endTS = new TimeSpan(my_stopTime.Hour, my_stopTime.Minute, my_stopTime.Second); 
           if (noOfDaysToConsider == null) 
            noOfDaysToConsider = 0; 
           noOfDaysToConsider = 1; 
           DateTime DaysToConsider = DateTime.Now.AddDays((-1) * noOfDaysToConsider).Date; 

           if (noOfDaysToConsider > 0) 
           { 
            try 
            { 
             MsgBox = "Schedule Number of days is greater than 0"; 
             Thread.Sleep(500); 
             MsgBox = null; 
             //it shld be greater than or equal to 

             if (DbUpdateLoop.context.Database.Connection.State == System.Data.ConnectionState.Closed) 
              DbUpdateLoop.context.Database.Connection.Open(); 
             var allEntries = DbUpdateLoop.context.EnergyMeter_GridTbl.Where(x => x.Timestamp > DaysToConsider).ToArray(); 
             var entries = allEntries.Where(x => x.Timestamp.TimeOfDay >= startTS && x.Timestamp.TimeOfDay < endTS).ToArray(); 
             try 
             { 
              double avgKW = 0.2;//entries.Average(x => x.KW); //set as default uncoment when required. 
              present_plm_data.threshHold = Math.Round(avgKW, 5); 
              AVGTHRESHOLD = present_plm_data.threshHold; 
             } 
             catch (Exception ex) 
             { 
              // if no data is there in the data base, then make a default as per the xml file... 
              MsgBox = "Schedule Threshold no data is there in the data base, then make a default as per the xml file"; 
              Thread.Sleep(500); 
              MsgBox = null; 
              present_plm_data.threshHold = data.PlmThreshold; 
              AVGTHRESHOLD = present_plm_data.threshHold; 
              using (System.IO.StreamWriter file = 
              new System.IO.StreamWriter(@"C:\XSR_BIB_V2\LOGFILE.txt", true)) 
              { 
               // file.WriteLine(DateTime.Now + "Schedule Threshold no data is there in the data base, then make a default as per the xml file " + ex); 
              } 
             } 

            } 
            catch (AccessViolationException aV) 
            { // if no data is there in the data base, then make a default as per the xml file... 
             MsgBox = "Schedule Threshold no data is there in the data base, then make a default as per the xml file"; 
             Thread.Sleep(500); 
             MsgBox = null; 
             present_plm_data.threshHold = data.PlmThreshold; 
             AVGTHRESHOLD = present_plm_data.threshHold; 
             using (System.IO.StreamWriter file = 
             new System.IO.StreamWriter(@"C:\XSR_BIB_V2\LOGFILE.txt", true)) 
             { 
              file.WriteLine(DateTime.Now + " ERROR IN PLM data into file " + aV); 
             } 
            } 
            catch (Exception ee) 
            { 

            } 
           } 
           } 
           catch (AccessViolationException aV) 
           { 
            using (System.IO.StreamWriter file = 
             new System.IO.StreamWriter(@"C:\XSR_BIB_V2\LOGFILE.txt", true)) 
            { 
             file.WriteLine(DateTime.Now + " ERROR IN PLM data into file " + aV); 
            } 
           } 
           catch (Exception ee) 
           { 

           } 
          } 
         } 

         if (present_plm_data.peakType == 0)      //Peak type = High 
         { 
          //broadcast_Low = true; 
          //broadcast_Medium = true; 
          MsgBox = "Schedule TYPE 0 High Peak"; 
          Thread.Sleep(500); 
          MsgBox = null; 
          firsttime_MidPeak = 0; 
          firsttime_OffPeak = 0; 
          AlgorithmForHighPeak(present_plm_data); 
          Thread.Sleep(3000); 
          Thread.Sleep(5000); 
         } 
         else if (present_plm_data.peakType == 1)    //Peak type = Medium 
         { 
          //broadcast_Low = true; 
          //broadcast_High = true; 
          MsgBox = "Schedule TYPE 1 Medium Peak"; 
          Thread.Sleep(500); 
          MsgBox = null; 
          firsttime_OnPeak = 0; 
          firsttime_OffPeak = 0; 
          AlgorithmForMediumPeak(present_plm_data); 
          Thread.Sleep(3000); 
          Thread.Sleep(5000); 
         } 
         else if (present_plm_data.peakType == 2)    //Peak type = Low 
         { 

          MsgBox = "Schedule TYPE 2 Low Peak"; 
          Thread.Sleep(500); 
          MsgBox = null; 
          firsttime_OnPeak = 0; 
          firsttime_MidPeak = 0; 
          AlgorithmForLowPeak(present_plm_data); 
          Thread.Sleep(3000); 
          Thread.Sleep(5000); 
         } 
         // })); 



        } 



       } 
       else if (gridpst == false) 
       { 
        //switch to battery and break until grid is on 
        MsgBox = "Schedule not running.."; 
        Thread.Sleep(500); 
        MsgBox = null; 

       } 


      } 
      catch (Exception ex) 
      { 
       MsgBox = " Schedule not running.due to unknown exception,please wait.."; 
       Thread.Sleep(500); 
       MsgBox = null; 
      } 
      return true; 
     } 
+0

上線你有例外? – user7417866

+0

你可以打印堆棧跟蹤或調試到你實際得到異常的地方 – user7417866

+0

@ user7417866有你去 –

回答

1

這個問題已經得到了很好的確診前,做最好的事情是閱讀谷歌打你得到「CompileQueryPlan AccessViolationException」。 This blog postthis existing SO question是看起來最可靠的核心點擊。

  1. 具有.NET提供和實現SqlCompact本地DLL之間的不匹配:總之,三個基本原因進行了鑑定之前。避免這種失敗模式的最佳方法是使用Nuget package,這樣您就可以擁有自己的這些DLL的專用副本,並且可以確保不會出現DLL地獄問題。

  2. 在多個線程上運行SQL查詢。任何與SQL相關的代碼都可能出現這種情況。 SqlCompact不是線程安全的,需要鎖定。

  3. 未設置連接屬性。這是SO問題中被接受的答案。似乎不太可能是遠程原因,用戶的代碼通過使用異步定時器肯定在原因2周圍跳舞。

+0

如果我安裝了sqlce包,它可以解決一些問題你說的金塊經理? –

1

在.NET 4.0中,運行時處理某些作爲Windows結構化錯誤處理(SEH)錯誤引發的異常,作爲損壞狀態的指示器。這些損壞的狀態異常(CSE)不允許被標準託管代碼捕獲。我不會理解爲什麼或在這裏如何。閱讀這篇文章,關於CSE公司在.NET 4.0框架:

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

但有希望。有幾種方法可以解決這個問題:

重新編譯爲.NET 3.5程序集並在.NET 4.0中運行它。

Add a line to your application's config file under the configuration/runtime element: 
<legacyCorruptedStateExceptionsPolicy> enabled="true|false"/> 
Decorate the methods you want to catch these exceptions in with the HandleProcessCorruptedStateExceptions attribute. 

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035爲 細節。

更多參考:http://connect.microsoft.com/VisualStudio/feedback/details/557105/unable-to-catch-accessviolationexception

+0

兄弟這個答案我在某些帖子中看到過,這對我沒有任何作用。 –

相關問題