2010-05-18 218 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参与进一步的异步操作序列。