2015-11-03 57 views
0

我從另一個SO question找到了這個方法(函數?),我不確定如何使用它。我想用它來捕捉我的數據庫連接問題(通過無線網絡)並重試或拋出其他異常。我的應用程序只有一些數據庫訪問功能,所以我正要複製和粘貼所有內容,但如果需要更改某些內容,我不希望每次更新所有功能10次。如何使用此方法重用我的try/catch?

方法我想使用:功能

 private void Retry<T>(Action<T> retryAction) where T : DataContext, new() 
    { 
     var retryCount = 0; 
     using (var ctx = new T()) 
     { 
      for (; ;) 
      { 
       try 
       { 
        retryAction(ctx); 
        break; 
       } 
       catch (SqlException ex) 
       { 
        if (!Enum.IsDefined(typeof(RetryableSqlErrors), ex.Number)) 
         throw; 

        retryCount++; 
        if (retryCount > MAX_RETRY) throw; 

        Thread.Sleep(ex.Number == (int)RetryableSqlErrors.Timeout ? 
                  longWait : shortWait); 
       } 
      } 
     } 
    } 

例子我想給它:

public async Task<List<EmployeeDisplay>> GetInspectorsAsync() 
    { 
     using (M1Context m1 = new M1Context()) 
     { 

      var q = (from a in m1.Employees 
        where (a.lmeTerminationDate == null) 
        && (a.lmeInspectorEmployee == -1) 
        orderby a.lmeEmployeeName 
        select new EmployeeDisplay 
        { 
         EmployeeID = a.lmeEmployeeID, 
         EmployeeName = a.lmeEmployeeName.ToUpper().Trim() 
        }); 

      return await q.ToListAsync(); 
     } 

    } 


     public async Task<List<Reason>> GetScrapReasonsAsync() 
    { 
     using (M1Context m1 = new M1Context()) 
     { 

      Debug.WriteLine("getting scrap reasons"); 
      var q = (from a in m1.Reasons 
        where a.xarReasonType.Trim().Equals("S") 
        select a); 

      return await q.ToListAsync(); 

     } 
    } 
+0

爲什麼你寫的方法的10倍時,所有你需要做的是創建一個自定義類,您可以訪問它,或做一個靜態類,然後調用從該方法10個說不同的地方..我希望我正確理解你的問題.. – MethodMan

+0

這是一個非常普通的重試方法來處理'SqlException'你還想要做什麼呢? – SimpleVar

+0

你正確理解MethodMan,答案不是很好。只需要完成一些事情,並且由於缺乏經驗,我只知道一個快速而骯髒的方法來完成任務。幸運的是,我讓你們幫助我!至於我還想做什麼,目前我還不確定,但我討厭他們有重複方法的想法,當我可以爲它創建一個自定義類時。 – MEEECNC

回答

0

要使用你需要做以下

    方法
  1. 您的背景

enter image description here

  • 你的重試方法
  • enter image description here

  • 你做的東西方法
  • enter image description here

    1. 枚舉

    enter image description here

    +0

    我部分能夠遵循這一點,但我對如何調用該方法有點遺憾。我假設你的例子中的MyRetryActionMethod()就像我的GetInspectorsAsync()方法。你認爲你可以在你的例子的// Do Stuff部分擴展一下嗎?我不熟悉上面創建方法的這個過程:MyRetryActionMethod =(mycontext)=> {// Do Stuff}; – MEEECNC

    +0

    我已經爲您添加了示例 –

    相關問題