2011-09-30 26 views
2

當我看到關於等待第一條新聞,我感到非常興奮,我想使用它的很多方面。 其中之一就是在我的web框架中使用它來隱藏客戶端/服務器交換的異步方面,就像它在幾個框架中完成的一樣。 因此,這裏的交易:覆蓋連續狀態存儲/恢復算法?

我想編寫這樣的事情:

{ 
    Page p = new Page(); 
    FormResponse response = await p.Show(); 
    var field1 = reponse.inputField["input1"]; 
    ... 
} 

我想開發要能寫在服務器上的代碼。正如你猜p.Show()寫在HttpResponse對象的HTML代碼的形式顯示在頁面上,並傳送到客戶端的響應,因此,線程是 打死,我從來沒有達到,下一條指令(FormResponse response =)。

因此,這裏是我的問題: 有沒有做這樣的事的方法嗎?我知道等待切割代碼,繼續打包它,爲我們做封閉,並在p.Show()完成時將它存儲在某個地方以便回調它。 但是在這裏,線程將被殺死,這是我的代碼,它接收來自Page的提交響應,必須處理它。所以我必須恢復「等待」創建的延續並自己執行。

我收到高或是否有可能?

編輯:額外的相關信息

我解釋一點,但我們需要的例子。 想象一下,您希望對web服務進行異步調用,您只需使用await然後調用Web即可。 一個網不顯示任何頁面時,它返回的信息,您可以繼續下一個指令,所以用一個網,我們有:客戶端 - >服務器A [-callwebs->服務器B - >]服務器A - >客戶端。現在,設想一個網絡必須顯示用戶界面以從用戶那裏獲取一些信息,我們可以將這種網絡稱爲UIwebs(由多個webapp調用的可重複使用的接口),它顯示UI,抓取信息,並將其發回給調用者。我們有:客戶端 - >服務器A [-response_redirect->客戶端-get->服務器B(這裏是UIwebs,客戶端輸入什麼)-response_redirect->客戶端-get->]服務器A - >客戶端

我把括號之間具有由developper的方式來處理:

這樣一個經典的網,我能想象異步頁「沉睡」等待腹板至反應,但有了UI網頁,我們必須響應重定向到客戶端,因此該頁面是爲asp.net完成的,並且SynchronizationContext表示沒有更多的異步指令需要等待。

事實上,這裏我需要的是一樣打開Web服務器上,併發送請求給它至極承擔責任:水災只恢復的await後執行的代碼所需要的一切。

問候, 朱利安

回答

0

我不知道是什麼問題。

如果您有,例如,ASP.NET異步頁面,則任何頂級(async void)函數都會正確地通知ASP.NET該頁面不完整並釋放該線程。稍後,繼續將在(可能是另一個)線程上運行,恢復請求上下文並完成請求。

async設計是仔細完成,以確保這種確切的行爲。特別是,async void增加了SynchronizationContext中的未完成異步操作計數,正如我描述的in a recent MSDN article

如果您正在運行自己的主機(即不使用ASP.NET),則必須實施SynchronizationContext。這不是微不足道的,但也不是非常難。一旦完成,asyncawait將「正常工作」。 :)

響應更新的答案編輯:

記住await/async只是語法糖;他們沒有啓用以前不可能的任何事情 - 他們只是讓事情變得更容易。

如果我正確理解您的情況,您希望Web服務返回一個UI,然後對其進行響應。這是HTTP工作的反轉,所以你必須用viewstate做一些時髦的東西。我會考慮它...

+0

我完成了我的問題:) – vans