0

我最近对 ​​Silverlight 5 中的 async/await(asyncctp) 功能进行了一些测试。

两个测试都使用了以下硬件:

  • 英特尔 snb 2.3g
  • 8g DDR
  • 视窗 7 - 64 位
  • 银光 5
  • SQL Server 2008 - R2

测试逻辑如下:

  1. 没有异步/等待:

    public void LoadMasterItem(string strUNIT_ID)
    {
        **DateTime dt = DateTime.Now;**
        ctx.OBS_UNITs.Clear();
        this.IsMasterItemBusy = true;
        ctx.Load(ctx.GetOBS_UNITQuery().Where(p => p.UNIT_ID == strUNIT_ID)).Completed += (sender, e) =>
        {
            this.MasterItem = ctx.OBS_UNITs.FirstOrDefault();
            this.IsMasterItemBusy = false;
             LoadDataArgs args = ExceptionManager.CheckDataContextResult(sender, args);
             **var ts = DateTime.Now.Subtract(dt).Ticks;**
            **string str = ts.ToString();**
        };
    }
    
  2. 使用异步/等待:

    public **async** Task<LoadDataArgs> LoadMasterItem(string UNIT_ID)
    {
        **DateTime dt = DateTime.Now;**
        ctx.OBS_UNITs.Clear();
        var oper = await ctx.Load(ctx.GetOBS_UNITQuery().Where(p => p.UNIT_ID == UNIT_ID)).AsTask();
        LoadDataArgs args = ExceptionManager.CheckDataContextResult(oper);
        if (args.LoadState)
        {
            this.MasterItem = oper.Entities.FirstOrDefault();
        }
    
        **var ts = DateTime.Now.Subtract(dt).Ticks;**
        **string str = ts.ToString();**
        return args;
    }
    

实验 1 的刻度:5304010
实验 2 的刻度:30001

我很好奇为什么以及如何使用 async/await 将我的 Silverlight 应用程序改进到如此显着的程度。如果我的测试“不公平”,请也给我一些关于如何改进它们的评论。


我已将“str”值绑定到不使用调试模式的 UI。这些托管在 IIS 中并在 IE9 中执行。

结果如下:

1的刻度
:5504010 2 的刻度:5680325

感谢您的回复,看来我对实际性能有误。

4

2 回答 2

1

当您检查第二个样本中的时间时,我认为加载操作实际上并未完成。该方法返回了异步执行的任务,并不一定意味着在您从异步方法返回时已经执行了加载。

于 2012-09-07T08:18:32.333 回答
1

await 运算符只是为了在处理链接调用时帮助您的代码更具可读性和更简单。

于 2014-11-06T20:37:29.057 回答