2015-04-01 59 views
-2

我有類---類框架的核心是在下面給出: -靜態類轉換成異步模式

class Pingdom 
     { 
      public static string Pingdom(List<Config> configtypes) 
      { 
       StringBuilder response = new StringBuilder(); 
       bool status = false; 
       foreach(var c in configtypes) 
       { 
        switch(c.Type) 
        { 
         case ConfigTypes.Database: 
          { 
           status = PingdomDB(c.ConnectionType); 
          } 
          break; 
         case ConfigTypes.API: 
          { 
           status = PingdomAPI(c.Endpoint); 
          } 
          break; 
        } 
       } 

       if (status) 
        return "Ping"; 
       else 
        return "No Ping"; 
      } 
------------------------------------------------------- 
....................................................... 
} 

現在,而不是類是靜態的,我想它是在這樣我可以以更強大的方式採用更多異步方法。

實質上,獲取配置列表,但異步處理它們。

如何去做這個方法?

+1

這一切都取決於'PingdomDB'和'PingdomAPI',您需要向我們展示你的這些功能在做什麼,我們就如何將其轉化爲被異步調用的任何建議。現在你的代碼只返回列表中最後一個項目的狀態,這是你真正想要的嗎? – 2015-04-01 23:22:43

回答

-1
class Pingdom { 
     public static string PingMe(List<Config> configtypes) 
     { 
      bool status = true; 
      List<Task> tasks2 = new List<Task>(); 
      foreach (Config config in configtypes) 
      { 
       if (config.Type == ConfigTypes.Database) 
       { 
        tasks2.Add(Task.Factory.StartNew(() => { status = status && PingdomDB(config.ConnectionType); }, TaskCreationOptions.LongRunning)); 
       } 
       else if (config.Type == ConfigTypes.API) 
       { 
        tasks2.Add(Task.Factory.StartNew(() => { status = status && PingdomAPI(config.ConnectionType); }, TaskCreationOptions.LongRunning)); 
       } 
      } 
      Task.WaitAll(tasks2.ToArray(), System.Threading.Timeout.Infinite); 
      if (status) 
       return "Ping"; 
      else 
       return "No Ping"; 
     } 
    } 
+0

如果這些是長時間運行的任務,那麼它將始終返回「Ping」。 您應等待任務完成或返回任務結果的狀態。 由於每次對PingMe的調用都只創建1個任務,因此不需要列表。 – shr 2015-04-02 07:40:43

+0

對不起,剛纔看到創建了多個任務。您仍然需要等待它們完成以計算狀態的返回值。 var tasks2 =新列表>(); ...... //在foreach循環之後 等待Task.WhenAll(tasks2); tasks2.ForEach(t => status = status && t.Result); 返回狀態? 「平」:「不平」; – shr 2015-04-02 08:00:13

+0

謝謝,斯科特,我標記了它。謝謝,在我轉移代碼時,我忘了包含WaitAll。詛咒我的ADHD :) – 2015-04-02 16:55:41