1

因此,对于使用过的启用 ajax 的 wcf 服务,可以从数据库中获取记录并将其显示在客户端,而无需使用...AsyncPattern的属性OperationContractAttribute

  • 我什么时候应该考虑AsyncPattern财产?

我的操作合同方法示例,

[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;
        }
    }
4

1 回答 1

1

AsyncPattern 有一些用途——它主要是一种服务器性能优化,允许您在阻塞操作时释放工作池请求线程。例如,当发生像 DB 访问这样的长时间运行的阻塞操作时,如果您在具有 AsyncPattern 的服务器上使用异步 DB API,则工作线程可以返回池并为其他请求提供服务。当数据库访问完成时,原始请求稍后在另一个工作线程上“唤醒”,其余工作完成(服务客户端只是耐心等待 - 这对它来说都是透明的,除非您使用的是 AsyncPattern 感知客户端和绑定)。如果仔细完成,这可以让您的服务处理更多请求。要利用这一优势,您需要在服务器上使用具有本机异步实现的 API。我看到的唯一一个可能是候选者是您的 SQLHelper.ExecuteDataset 方法中发生的 DB 调用 - 您必须阅读底层 API 以确保 TRUE 异步选项可用(存在 BeginXXX/EndXXX 方法并不一定意味着它是一个真正的异步实现)。System.SqlClient 的东西是真正异步的。

提醒一句:您必须处理大量请求才能使这变得有价值 - 以这种方式拆分代码的复杂性和可读性需要付出巨大的代价。您还需要非常了解多线程编程——在锁定、错误处理等方面存在许多陷阱,这些都远远超出了 SO 帖子的范围。

祝你好运!

于 2010-03-08T08:10:56.147 回答