2010-05-18 174 views
1

我有一個奇怪的問題。我想在同步函數調用中等待結束異步調用。在其他項目中,我成功使用了ResetEvents,但在sl中它似乎沒有工作。silverlight。等待結束異步方法同步方法

//Sync call save some value in storage 
    public static void SaveValue(string key, object value, bool encrypted) 
    { 
     if (encrypted) 
     { 
      isEncrypting = true; 
      var Registrator = new RegistratorClient(); 
      Registrator.EncryptCompleted +=Registrator_EncryptCompleted; 
      Registrator.EncryptAsync(obj); //async call 
      while (isEncrypting) 
       Thread.Sleep(10); 
      return; 
     } 
     ... 
    } 
    static void Registrator_EncryptCompleted(object sender, EncryptCompletedEventArgs e) 
    { 
     if (String.IsNullOrEmpty(fieldToSave)) 
      return; 
     App Appvars = Application.Current as App; 
     if (Appvars.Settings.Contains(fieldToSave)) 
      Appvars.Settings[fieldToSave] = e.Result; 
     else 
      Appvars.Settings.Add(fieldToSave, e.Result); 
     isEncrypting = false; 
    } 

這種方法是不是太工作:(請幫助什麼是錯

回答

2

問題出在SL中,所有服務調用都是在UI線程上進行的。所以你有一個方法試圖在UI線程上休眠,等待一個必須在UI線程上發生的回調。

在SL中創建真正的同步呼叫是不可能的。如果你真的想以同步的方式處理事情,請看Caliburn。他使用一些很酷的協同程序模式來模擬同步編程,同時保持實際的服務調用異步。

0

正如: - ?

即使*奇數=偶數

也是如此:

async * sync = async。

您正在試圖製作async * sync = sync,那是什麼讓你失望。只要將一個異步操作添加到序列中,整個序列就會變爲異步。如果你可以讓你的外部SaveValue操作接受它是異步的,那麼事情可以更好地工作。

由於代碼將遵循相當不同的路徑,這取決於加密是否爲真,那麼真的應該有兩個版本的SaveValue

例如: -

public static void SaveValue(string key, object value) 
{ 
    App Appvars = Application.Current as App; 
    if (Appvars.Settings.Contains(key)) 
     Appvars.Settings[key] = value; 
    else 
     Appvars.Settings.Add(key, value); 
} 

public static void SaveValue(string key, object value, Action doneCallback) 
{ 

    var Registrator = new RegistratorClient(); 
    Registrator.EncryptCompleted += (s, args) => 
    { 
     // Really should consider some exception handling here. 
     SaveValue(key, s.Result); 
     if (doneCallback != null) 
      doneCallback(); 
    } 
    Registrator.EncryptAsync(value); //async call 
} 

在這個版本的第一SaveValue是同步的,而它執行加密是異步的並且將調用doneCallback當完整的第二個。此回調允許此異步版本的SaveValue參與進一步的異步操作序列。