如何调用返回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返回给调用方法。
我不知道该怎么做。
答案 0 :(得分:8)
大多数异步方法返回IAsyncResult。
如果是,您可以使用IAsyncResult.AsyncWaitHandle阻止(IAsyncResult.AsyncWaitHandle.WaitOne)阻止,直到操作完成。
即:
bool aBool;
IAsyncResult res = client.CallAnAsyncMethod(id);
res.AsyncWaitHandle.WaitOne();
// Do something here that computes a valid value for aBool!
return aBool;
答案 1 :(得分:4)
同步调用方法,或为其添加CallAnAsyncMethodCompleted
事件处理程序,并使用e.Result
对象处理返回值。
答案 2 :(得分:3)
您可以简单地同步调用Web方法吗?
答案 3 :(得分:2)
这至少是近几天我第三次看到这类问题,所以我会问一些问题(OP的答案很明显)。
您为什么要考虑异步调用Web服务?性能?没有阻塞工作线程?
您是否看到了一个导致您使用异步Web服务调用的示例?如果是,您可以发布示例的URL吗?
感谢您的时间。您对这些问题的回答将帮助我回答其他问题。
我在这个问题上添加了一个“silverlight”标签,我建议你将来自己也这样做,因为Silverlight的问题。这创建了所有“阻塞”调用必须是异步的上下文。
现在,SilverLight专家应该回答,但我认为你的做法是错误的。您正在失去呼叫的异步性质。我认为你的GetABoolean方法也应该是异步的,并且在得到答案之前不应该返回。
答案 4 :(得分:0)
如果调用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
}
这是一个可怕的解决方案,将来会引起巨大的麻烦,特别是如果你需要代码是线程安全的,但作为一个黑客,它可以工作。