2014-01-07 54 views
0

我正在研究由兩個組件組成的應用程序,一個客戶端應用程序和一個WCF服務。我需要在我的服務中調用的方法之一是一個長期運行的過程,我不想在運行時綁定WPF UI,並且我還想在每個階段完成時報告進度。我創建了一個後臺工作如下:運行WCF服務的WPF後臺工作者的報告進度

BackgroundWorker worker = new BackgroundWorker(); 
worker.WorkerReportsProgress = true; 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 

// run the process 
worker.RunWorkerAsync(); 

的DoWork的樣子如下(代理是我連接到服務):

proxy.CopyProjectToProduction(selectedItem, localDir, currentLabel); 

這個方法是一個6階段的過程,一些這可能需要幾毫秒,其中一些可能需要10秒或更多。我希望我的WPF進度條能夠做的是報告每個階段,然後通知它已更新的服務。在每個項目完成後,該服務需要暫停,並等待它從UI接收到它已完成的確認。要嘗試這樣做,我首先創建了以下類型:

[DataContract] 
public enum CopyProgress 
{ 

    [EnumMember] 
    Waiting = 0, 

    [EnumMember] 
    ConnectedToDev = 1, 

    // other enumerated types 
} 

在服務內我有三種方法。兩個公開訪問的,這讓枚舉值,並重新設置和其他私人其中一個由服務調用,如下:

public void WaitForStatusReset() 
{ 
    while (progress != CopyProgress.Waiting) { } 
} 

的爲長期運行的進程我的服務代碼的一部分的一個例子是如下所示:

// establish a connection to dev and update progress 
CreateTfsConnection(cDevServer); 
progress = CopyProgress.ConnectedToDev; 

WaitForStatusReset(); 

這對服務中的6個項目中的每一個重複。這個想法是它將完成正確的枚舉類型,然後等待UI完成。的UI執行以下操作(內側的大線圈):

CopyProgress currentProgress = proxy.GetCopyStatus(); 

// if the progress has changed then we need to increment the progress bar 
if (currentProgress != CopyProgress.Finished && currentProgress != progress) 
{ 
    worker.ReportProgress((int)progressIncrement); 
    proxy.ResetCopyStatus(); 
} 

應該循環不斷地尋找在進度變量的變化,並且當它確定它已經改變,它會更新進度條,然後重置服務。該服務將會看到它已被重新設置爲等待並繼續下一個位。在實踐中,currentProgress變量被設置一次(等待),然後程序掛起的下一次循環迭代。我懷疑我在這裏陷入了某種僵局,但我無法弄清楚我的錯在哪裏。

我可以更改我的服務,以便將流程的每個部分作爲方法公開,但是如果可能,我希望避免這種情況,因爲我想盡量保持客戶端代碼儘可能輕,並盡一切努力服務。

任何幫助表示讚賞。

+0

給我們一些東西給我們能夠在我們的機器上覆制問題。 –

+0

你使用的是什麼類型的綁定wshttpbinding或httpbinding或什麼? –

+0

@Julie,這是wsHttpBinding。我不認爲與服務的問題,因爲我有另一個異步方法,做了一個更簡單的過程,並且工作正常。 – Andrew

回答

1

我不確定阻塞服務等待UI調用的目的是什麼。另外,除非這是一個單線程的單實例WCF服務,否則維護服務中的操作狀態將會引起頭痛。

通過將操作的狀態寫入UI可以偵聽或輪詢的消息隊列或數據庫表,您可以獲得更好的服務。如果你真的想維護服務中的狀態狀態,你需要一個字典來將進程映射到一個特定的調用。

+0

阻塞是因爲在我的客戶端檢測到服務之前,可能會有超過1個項目在服務中完成,這意味着進度欄將不正確。儘管如此,我喜歡排隊的想法。我會試一試並回復你。謝謝。 – Andrew