首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >silverlight。同步方法中的等待结束异步方法

silverlight。同步方法中的等待结束异步方法
EN

Stack Overflow用户
提问于 2010-05-18 15:09:40
回答 2查看 4.8K关注 0票数 1

我有个奇怪的问题。我想在同步函数调用时等待结束异步调用。在其他项目中,我成功地使用了ResetEvents,但在sl中,它似乎不起作用。

代码语言:javascript
运行
复制
    //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;
    }

此方法也不起作用:(请帮助。怎么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-18 21:02:19

问题来自于在SL中所有服务调用都是在UI线程上进行的。因此,有一个方法试图在UI线程上休眠,等待必须在UI线程上发生的回调。

在SL中创建真正的同步调用是不可能的。如果你真的想以一种同步的方式工作,那就看看Caliburn吧。他使用一些很酷的协同例程模式来模拟同步编程,同时让实际的服务调用保持异步。

票数 2
EN

Stack Overflow用户

发布于 2010-05-18 18:29:46

就像:

奇偶数*

=偶数

也是如此:

async * sync =异步。

你正在尝试制作async * sync = sync,这就是让你犯错的原因。一旦将异步操作添加到序列中,整个序列就变成异步的。如果您可以让您的外部SaveValue操作接受它是异步的,那么事情就会工作得更好。

由于代码将遵循完全不同的路径,这取决于加密是否为真,因此确实应该有两个版本的SaveValue

例如:

代码语言:javascript
运行
复制
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的异步版本参与进一步的异步操作序列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2855129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档