【问题标题】:Calling a method and waiting for a return value调用方法并等待返回值
【发布时间】:2009-03-11 20:18:48
【问题描述】:

如何调用返回布尔值的方法,但在该方法内部为了确定布尔值,它异步调用 Web 服务?

bool myBool = GetABoolean(5);    

public bool GetABoolean(int id)
{

  bool aBool;

  client.CallAnAsyncMethod(id);  // value is returned in a completed event handler.  Need to somehow get that value into aBool.

  return aBool;  // this needs to NOT execute until aBool has a value

}

所以我需要让 GetABoolean 方法等到 CallAnAsyncMethod 完成并返回一个值,然后再将 bool 返回给调用方法。

我不知道该怎么做。

【问题讨论】:

  • 这就是调用异步的全部要点——你不必等待结果......所以如果你想要结果——只需同步调用它!
  • 异步调用的原因是不是你无法控制的?如果没有,马克就在点。不要过于复杂(具体原因请参见我极其复杂的示例)。
  • 这是用于 Silveright 的端口。否则我的通话将保持同步,我会更开心!

标签: c# wcf silverlight asynchronous


【解决方案1】:

大多数异步方法返回 IAsyncResult。

如果您这样做,您可以使用 IAsyncResult.AsyncWaitHandle 来阻止 (IAsyncResult.AsyncWaitHandle.WaitOne) 阻止直到操作完成。

即:

bool aBool;

IAsyncResult res = client.CallAnAsyncMethod(id); res.AsyncWaitHandle.WaitOne(); // 在这里做一些计算 aBool 的有效值的事情! 返回一个布尔值;

【讨论】:

    【解决方案2】:

    要么同步调用该方法,要么为其添加CallAnAsyncMethodCompleted事件处理程序,并使用e.Result对象处理返回值。

    【讨论】:

      【解决方案3】:

      可以简单的同步调用web方法吗?

      【讨论】:

        【解决方案4】:

        这至少是我最近几天第三次看到这种问题了,所以我会问一些问题(OP的答案很明显)。

        您为什么考虑异步调用 Web 服务?表现?没有阻塞工作线程?

        您是否看过一个示例,可以引导您使用异步 Web 服务调用?如果是这样,您可以发布示例的 URL 吗?

        感谢您的宝贵时间。您对这些问题的回答将帮助我回答其他问题。


        我为这个问题添加了一个“silverlight”标签,我建议您以后自己针对 Silverlight 问题做同样的事情。这创建了所有“阻塞”调用必须是异步的上下文。

        现在,SilverLight 专家应该回答,但我认为您的做法是错误的。您正在失去调用的异步性质。我认为您的 GetABoolean 方法也应该是异步的,并且在得到答案之前不应该返回。

        【讨论】:

        • 我正在尝试将此 WPF 代码移植到 Silverlight,并且需要将调用设为异步调用
        • 感谢您的意见。我有很多这样的代码,其中我有一个返回值的方法。在该方法中,它会进行服务调用。以前该呼叫是同步的。我现在需要让它异步......但我需要它在那个方法中坐在那里,直到服务调用返回。
        • 再说一遍,“不,你没有”。使调用方法异步,你不必坐在里面。
        【解决方案5】:

        如果调用 CallAnAsyncMethod 和返回之间有更多代码,那么异步执行它有潜在价值(尽管它可能是不必要的预优化),否则同步您的代码。

        如果您无法控制强制您异步执行此代码的架构,则您必须监控变量并循环以等待完成。

        bool myBool;
        bool retrievingMyBool;
        RetrieveABoolean(5);    
        
        public bool RetrieveABoolean(int id)
        {
            client.CallAnAsyncMethod(id);  // value is returned in a completed event handler.  Need to somehow get that value into aBool.
            retrievingMyBool = true;
            while (retrievingMyBool)
            {
                Thread.Sleep(100);
            }
        }
        
        private void completedEventHandler([[parameters go here]])
        {
            // code to handle parameters
            myBool = // whatever
            retrievingMyBool = false    
        }
        

        这是一个可怕的解决方案,将来会让你头疼不已,尤其是如果你需要代码是线程安全的,但作为 hack,它可以工作。

        【讨论】:

          猜你喜欢
          • 2018-05-28
          • 2013-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-17
          • 2019-07-25
          • 1970-01-01
          相关资源
          最近更新 更多