簡體   English   中英

WCF服務Begin方法調用后台工作程序

[英]WCF Service Begin method calls Background worker

我知道關於此的信息遍布整個Internet,但是我找不到針對我的情況的任何解決方案。

我正在使用.NET 4.5 VS 2012

我已經創建了一個WCF服務

#region ISampleService Members

public IAsyncResult BeginServiceMethod(string msg, AsyncCallback callback, object asyncState)
{
    Thread.Sleep(10 * 1000);

    return new CompletedAsyncResult<String>(msg.ToUpper());
}

public string EndServiceMethod(IAsyncResult result)
{
    CompletedAsyncResult<String> res = result as CompletedAsyncResult<String>;
    return res.Data;
}

#endregion

現在,我需要做的是從BeginServiceMethod調用另一個方法,該方法最終將啟動后台工作程序以執行其操作。 關於后台工作人員完成的事件,我想繼續執行EndServiceMethod

我不知道是否可能,或者它是否是一個好的設計。 實際上,我在將舊代碼遷移到新框架時遇到了這個問題,只想在設計和代碼上做一些改進。

[編輯]
換句話說,我可以說我需要在beginX和endX方法之間插入動作。

此msdn博客文章應徹底回答您的問題: http : //blogs.msdn.com/b/wenlong/archive/2009/02/09/scale-wcf-application-better-with-asynchronous-programming.aspx

上面的文章包含示例代碼,應該會有所幫助。

本文的要旨是:

“ *為了獲得最佳性能,調用/實現上述異步模式時,有兩個原則:

·原則1:不要在Begin方法(上面的BeginDoWork)內部進行繁重的工作。 原因是您應盡快返回調用線程,以便調用者可以安排其他工作。 如果是UI線程,則應用程序需要使用該線程來響應用戶輸入。 如果可能,應始終將繁重的操作放在其他線程中。

·原則2:避免在Begin方法的同一線程上調用End方法(上面的EndDoWork)。 End方法通常處於阻塞狀態。 它等待操作完成。 如果實現End方法,則會看到它實際上調用了IAsyncResult.WaitHandle.WaitOne()。 另一方面,作為常規實現(例如,此Blog條目中隨附的示例),此WaitHandle是分配了ManualResetEvent的延遲。 只要您不調用它,就根本不會分配它。 對於快速操作,這是相當便宜的。 但是,一旦調用End,就必須分配它。 調用End的正確位置是在操作的回調中。 當回調被調用時,這意味着阻塞工作實際上已經完成。 此時,您可以調用End來獲取數據而不犧牲性能。*“

請注意,上面的帖子過時了,因為您使用的是.Net 4.5,所以您也可以使用異步等待模式。

您還可以使用任務並行庫(TPL)啟動線程:Task.Factory.StartNew()...在WCF(.net 4.0+)中使用基於TPL的異步操作時,建議在傳統Async(IasyncResult)上使用異步操作。

如果您不能使用基於TPL的操作,則可以對使用相同API的委托執行BeginInvoke。

問我是否要詳細了解上述操作的詳細信息,我沒有寫這些內容,因為您會在同一網上找到很多文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM