代码之家  ›  专栏  ›  技术社区  ›  ScottG

调用方法并等待返回值

  •  4
  • ScottG  · 技术社区  · 16 年前

    如何调用返回bool的方法,但在该方法内部,为了确定bool的值,它异步调用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返回给调用方法。

    我不知道怎么做。

    5 回复  |  直到 16 年前
        1
  •  8
  •   Reed Copsey    16 年前

    大多数异步方法返回IAsyncResult。

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

    即:

    bool aBool;

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

        2
  •  4
  •   Sören Kuklau Keith Boynton    16 年前

    或者同步调用该方法,或者添加 CallAnAsyncMethodCompleted 它的事件处理程序,并使用 e.Result 对象来处理返回值。

        3
  •  3
  •   Bob King    16 年前

    你能简单地同步调用web方法吗?

        4
  •  2
  •   John Saunders    16 年前

    这是最近几天我至少第三次看到这样的问题,所以我会问一些问题(OP的答案是显而易见的)。

    为什么要考虑异步调用web服务?表演?不阻塞工作线程?

    您是否看到过一个引导您使用异步web服务调用的示例?如果是的话,你能发布这个例子的URL吗?

    谢谢你的时间。你对这些问题的回答将帮助我回答其他问题。


    我在这个问题上添加了一个“silverlight”标签,我建议你以后也这样做,对于silverlight问题。这将创建所有“阻塞”调用都必须是异步的上下文。

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

        5
  •  0
  •   Michael Meadows    16 年前

    如果在调用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    
    }
    

    这是一个可怕的解决方案,在未来会给您带来巨大的麻烦,特别是如果您需要代码是线程安全的,但作为一个黑客,它可以工作。