【问题标题】:azure tables API- should I use ExecuteAsync天蓝色表 API-我应该使用 ExecuteAsync
【发布时间】:2013-11-15 14:41:28
【问题描述】:

我对异步 C# 编码非常陌生,对于 Azure 表,有同步 + 异步调用可供选择。假设 1)我必须在我的方法中获取一个实体,并且 2)线程在此期间没有其他可以做的事情,是否有任何理由使用下面的异步版本的代码?通过释放线程来处理不同的事情,它会增加我的多线程应用程序的吞吐量吗?不确定同步调用“阻塞”的程度有多深。我知道有时可能需要 300 多毫秒才能从 azure 表中获得响应。

对于上下文,我正在为 Photon Socket Server 实现编码 - 它使用线程池和光纤。我正在实现这样的接口(没有异步事件) protected override void OnOperationRequest(OperationRequest o, SendParameters p) 我可以这样做,但是像这样在 Photon 中使用异步调用:requestFiber.Enqueue( () => DoStuff; );

/* synchronous version of code fragment */

entity = tableRetryPolicy.ExecuteAction( () => {
  var result = table.Execute (retrieveOp);
  if( result.HttpStatusCode == 404 ) 
    return null;
  App.CheckHttpStatusCode ("Get (Table) Retrieve", result, 200);
  return (T) result.Result;
});

/* async version of code fragment */
var task = tableRetryPolicy.ExecuteAsync( () => 
  table.ExecuteAsync (retrieveOp).ContinueWith( t =>
    {
      if (t.Exception != null)
      {
        // non-transient exception occurred or retry limit reached
        App.log.Error("Get (Table) failed all retries: entityId: " + entityId);
      }
      else
      {
        if( t.Result.HttpStatusCode == 404 )
          return;
        App.CheckHttpStatusCode ("Get (Table) Retrieve", t.Result, 200);
        entity = (T) t.Result.Result;
      }
    }
  )); 
task.Wait(); 
// ^  dont have anything else we can do with this execution path, except wait!

【问题讨论】:

    标签: .net multithreading azure asynchronous azure-table-storage


    【解决方案1】:

    这更像是一个一般的 .Net 线程问题。公开的存储 api 是真正同步和异步的,这意味着 Sync 方法将阻塞调用线程并在该线程上完成所有工作,而 Async 方法不会阻塞并使用 IO 完成端口/calblacks。异步存储 api 还允许抢先取消和抢先超时,如果您有严格的性能要求,这会有所帮助(请参阅请求选项超时属性)。

    要考虑的最重要的事情是您的应用程序需要消耗多少线程。无论您使用哪种实现/堆栈,每个请求使用 1 个线程只会扩展到最多几千个并发请求,因为您将花费更多时间/内存交换线程。 (这对缓存也不是很好)。关于线程的意见差异很大,但一般来说,对于真正的高性能/大规模应用程序,使用少量线程(大约是逻辑处理器数量的两倍)的实现和异步请求将比具有多线程和同步请求的实现更高和更线性执行。

    【讨论】:

    • 谢谢乔!所以解释一下并确保我理解 - 在上面的代码示例中 task.Wait() 将释放线程以可能做其他工作,而 table.Execute() 将绝对阻塞线程?
    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多