【问题标题】:What is the use of "AsyncPattern" property of "OperationContractAttribute" + wcf?“OperationContractAttribute”+ wcf 的“AsyncPattern”属性有什么用?
【发布时间】:2010-03-04 05:34:24
【问题描述】:

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

  • 什么时候应该考虑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;
        }
    }

【问题讨论】:

  • 你应该摆脱那个 try/catch。它对你没有好处,实际上破坏了原始堆栈跟踪,使异常看起来像是来自“抛出”的地址。
  • @John 好的,我会立即做的......

标签: ajax wcf operationcontract


【解决方案1】:

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

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

祝你好运!

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多