2010-03-04 20 views
1

因此,對於使用AJAX的WCF服務,從數據庫獲取記錄,並在不使用的OperationContractAttributeAsyncPattern財產....在客戶端顯示出來「OperationContractAttribute」+ wcf的「AsyncPattern」屬性的用法是什麼?

  • 當我應該考慮AsyncPattern財產?

樣品我的OperationContract的方法,

[OperationContract] 
public string GetDesignationData() 
    { 
     DataSet dt = GetDesignationViewData(); 
     return GetJSONString(dt.Tables[0]); 
    } 
    public string GetJSONString(DataTable Dt) 
    { 
     string[] StrDc = new string[Dt.Columns.Count]; 
     string HeadStr = string.Empty; 
     for (int i = 0; i < Dt.Columns.Count; i++) 
     { 
      StrDc[i] = Dt.Columns[i].Caption; 
      HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\","; 
     } 
     HeadStr = HeadStr.Substring(0, HeadStr.Length - 1); 
     StringBuilder Sb = new StringBuilder(); 

     Sb.Append("{\"" + Dt.TableName + "\" : ["); 
     for (int i = 0; i < Dt.Rows.Count; i++) 
     { 
      string TempStr = HeadStr; 
      Sb.Append("{"); 
      for (int j = 0; j < Dt.Columns.Count; j++) 
      { 
       if (Dt.Rows[i][j].ToString().Contains("'") == true) 
       { 
        Dt.Rows[i][j] = Dt.Rows[i][j].ToString().Replace("'", ""); 
       } 
       TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString()); 
      } 
      Sb.Append(TempStr + "},"); 
     } 
     Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1)); 
     Sb.Append("]}"); 
     return Sb.ToString(); 
    } 
    public DataSet GetDesignationViewData() 
    { 
     try 
     { 
      string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; 
      return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, DataTemplate.spDesignation_View); 
     } 
     catch (Exception err) 
     { 
      throw err; 
     } 
    } 
+1

你應該擺脫的try/catch的。它並不好,實際上它破壞了原始的堆棧跟蹤,使得它看起來像是來自「throw」地址的異常。 – 2010-03-04 05:38:33

+0

@John好吧我會立即做到這一點.... – 2010-03-04 05:39:38

回答

1

AsyncPattern有一些使用說明 - 這是主要的服務器性能優化,使您可以騰出阻塞操作工人池請求的線程。例如,當發生長時間運行的阻塞操作(如DB訪問)時,如果您在具有AsyncPattern的服務器上使用異步DB API,則輔助線程可以返回到池併爲其他請求提供服務。原來的請求被「喚醒」後的DB訪問完成時,另一個工作線程,並完成其他工作完成(服務端只是耐心地waits-這一切都是透明的,除非您使用的是AsyncPattern感知客戶端和綁定)。如果仔細完成,此CAN可以讓您的服務處理更多請求。要充分利用,您需要使用具有本機異步實現的服務器上的API。唯一一個我看到的可能是一個候選者是DB調用這是發生在你的SQLHelper.ExecuteDataset方法 - 你必須讀了底層API,以確保真正的同步選項可用(的的BeginXXX/EndXXX方法存在並不一定意味着它是一個真正的異步impl)。 System.SqlClient的東西是真正的異步。

注意的一點是:你必須要處理大量的請求,使這個worthwhile-有對代碼的複雜性和可讀性的東西這種方式分割了顯著的成本。你還需要很好地理解多線程編程 - 在鎖定,錯誤處理等方面存在許多隱藏在SO帖子範圍之外的缺陷。

祝你好運!