我對於異步C#編碼非常新,對於Azure表,可以選擇同步+異步調用。假設1)我必須在我的方法中獲取一個實體,並且2)線程在此期間沒有其他任何可以執行的操作,是否有任何理由使用下面的異步版本的代碼?它是否會將吞吐量增加到我的多線程應用程序,通過釋放線程來處理不同的事情。不確定同步調用有多深「阻塞」了事情。我知道有時可能需要300多毫秒才能從天藍色表格獲得響應。azure表API - 我應該使用ExecuteAsync
對於上下文,我編寫了Photon套接字服務器實現 - 它使用線程池和Fibers。我採取這樣的接口(沒有異步事件) protected override void OnOperationRequest(OperationRequest o, SendParameters p)
我可以做的,但是使用異步調用的光子是這樣的: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!
謝謝喬!因此,爲了解釋並確保我明白了 - 在上面的代碼示例中,task.Wait()將釋放線程以可能執行其他工作,而table.Execute()將絕對阻止該線程? –