2017-09-25 181 views
0

NewbieQ:想知道C#異步/等待服務器端異步最佳實踐

我有現在的時間過長,完成導致超時錯誤的服務器端AJAX請求處理。

處理程序調用一個方法:

public bool Run(Guid jobId) // returns true if successful in running jobId 

運行作業交替IO那麼勢必CPU綁定操作的順序,在重要的情況下。

理想情況下,我希望能夠啓動運行,然後不時地查詢運行狀態,然後得到結果(運行返回的布爾值)。

當編寫服務器端代碼來執行此操作時,最佳做法是什麼?

我可以像這樣寫一個包裝嗎?

public async Task<bool> RunAsync(Guid jobId) {...} 

如果是這樣,那怎麼稱爲非異步運行?

或者我需要做一個完整的重新編寫的運行方法?最終,我從ajax請求處理程序調用此方法,所以我需要返回作業結果,或者我可以更改請求,然後啓動作業,然後不時查詢具有{bool resultReady,布爾?結果}或者像這樣的結構。

+0

如果您有多個可以並行運行的進程,async/await會很有幫助。如果這是一個正在運行並超時的單個進程,那麼異步/等待將不會對您有所幫助。聽起來更像是你應該有另一個進程,比如控制檯應用程序,它接收到一個通知來開始這項工作。控制檯應用程序不會像Web請求那樣超時,但您必須輪詢結果。或者,您可以考慮增加IIS/ASP.NET超時之前的時間.https://stackoverflow.com/questions/2414441/how-to-increase-request-timeout-in-iis。 – ps2goat

+0

瞭解,但是這是運行在一個Web服務上,其他用戶有其他事情要做,甚至要求這個任務的用戶可能希望在等待結果時做其他事情。我真正擔心的是,Web服務本身正在等待任務完成爲同步任務。 –

+0

@ ps2goat這是不正確的。 await對管理異步操作很有用。這些操作是否並行工作並不重要。 – Servy

回答

1

你真正想要的是不是可以用簡單的單一方法完成的事情。您真的需要一個排隊系統,您可以在隊列中檢查給定消息的狀態。你基本上有一種方法可以將某些東西放入隊列(如MSMQ),另一種方法可以返回給定的狀態jobId

1

您可以看看hangfire或signalR長時間運行的過程可能發生與事件處理程序通知客戶端。