我正在研究由兩個組件組成的應用程序,一個客戶端應用程序和一個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變量被設置一次(等待),然後程序掛起的下一次循環迭代。我懷疑我在這裏陷入了某種僵局,但我無法弄清楚我的錯在哪裏。
我可以更改我的服務,以便將流程的每個部分作爲方法公開,但是如果可能,我希望避免這種情況,因爲我想盡量保持客戶端代碼儘可能輕,並盡一切努力服務。
任何幫助表示讚賞。
給我們一些東西給我們能夠在我們的機器上覆制問題。 –
你使用的是什麼類型的綁定wshttpbinding或httpbinding或什麼? –
@Julie,這是wsHttpBinding。我不認爲與服務的問題,因爲我有另一個異步方法,做了一個更簡單的過程,並且工作正常。 – Andrew