2014-01-30 51 views
0

我使用wcf服務客戶端提交silverlight項目的數據更改。的相關性的代碼是這樣的:如何確保wcf服務客戶端在Silverlight中完成他的作品?

public class DispatcherCollection : UpdatableCollection<DocumentDispatcher> 
{ 
    public override void SubmitChanges() 
    { 
     DocumentServiceClient client = new DocumentServiceClient(); 
     client.NewDocumentCompleted += (s, e) => 
     { 
      // (s as DocumentServiceClient).CloseAsync(); 
      // do something 
     }; 
     client.UpdateColumnCompleted += (s, e) => 
     { 
      // (s as DocumentServiceClient).CloseAsync(); 
      // do something 
     }; 
     client.RemoveDocumentCompleted += (s, e) => 
     { 
      // (s as DocumentServiceClient).CloseAsync(); 
      // do something 
     }; 
     foreach (DocumentDispatcher d in this) 
     { 
      if (d.IsNew) 
      { 
       // d=>object[] data 
       client.NewDocumentAsync(data); 
       d.IsNew=false; 
      } 
      else 
      { 
       foreach (string propertyName in d.modifiedProperties) 
       { 
        client.UpdateColumnAsync(d.ID, GetPropertyValue(propertyName)); 
       } 
       dd.ClearModifications(); 
      } 
     } 
     foreach (DocumentDispatcher dd in removedItems) 
     { 
      client.RemoveDocumentAsync(dd.ID); 
     } 
     removedItems.Clear(); 
    } 
} 

類UpdatableCollection從ObserableCollection導出,並且我implemtent類DocumentDispatcher和UpdatableCollection邏輯緩衝,如新創建的,屬性修改和移除數據的變化。我使用SubmitChanges方法將所有更改提交給服務器。

現在我被卡住了: 1.在完成異步呼叫後關閉客戶端時,我不知所措。我不知道哪個回調是最後一個回調。 2.當用戶點擊保存按鈕後立即關閉IE時會發生什麼(這似乎是因爲它運行異步,但事實上更新線程正在努力運行)。

回答

0
  1. 您可以保留一個計數器或使用isbusy函數來監視來自異步調用的回調 - 確保它們全部完成。
  2. 如果用戶觸發對WCF服務的請求,WCF服務將完成,但不會有回叫 - 因爲應用程序將被關閉。
-1

正如你所說,這對我來說是一個好消息,即通話可以像「請求和遺忘」模式一樣工作。所以我不必擔心在提交過程中數據丟失。

爲了確保在應用程序關閉之前發送所有服務調用,我認爲counter是一個簡單而有效的想法。我會盡力在我的項目中實現它。

謝謝你的幫助!

0

我認爲沒有等待處理silverlight asynchornized的電話帶來不便。這是我的經歷。我想檢查並提交瀏覽器關閉時未明確提交的數據修改。我已經實現代碼在App_Exit這樣的:

private void Application_Exit(object sender, EventArgs e) 
    { 
     Document doc = EDPViewModel.CurrentViewModel.Document; 
     if (doc != null) new ServiceClient().SubmitChangesAsync(doc); 
    } 

只要在SubmitChangesAsync方法,DOC的未提交的修改被發現並提交。因此,由於異步運行功能,在發送服務調用時,應用程序尚未立即關閉。這將處理相關的應用程序資源,包括服務調用任務。所以上面的代碼不工作。我希望如此熱切的某處存在一種機制,它可以從Silverlight的異步調用導出等待句柄,這樣我就可以更新蒙山這上面的代碼:

private void Application_Exit(object sender, EventArgs e) 
    { 
     Document doc = EDPViewModel.CurrentViewModel.Document; 
     if (doc != null) 
     { 
      Task t = new TaskFactory().StartNew(() => new ServiceClient().SubmitChangesAsync(doc)); 
      t.Wait(); 
     } 
    } 

隨着等待操作我真的可以確保所有的修改確實提交了。那麼Silverlight中是否有類似的模式?

相關問題