azure tables API-我应该使用ExecuteAsync

时间:2013-11-15 14:41:28

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

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

对于上下文,我正在编写Photon Socket Server实现 - 它使用线程池和Fibers。我正在实现这样的接口(没有异步事件)  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!

1 个答案:

答案 0 :(得分:1)

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

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