我有一个带有两个回调的方法。一个用于错误,一个用于成功。 目前它看起来像这样:
private resultObject makeMyRequest()
{
requestObject request = new requestObject();
MakeRequest(request, (result) =>
{
return result;
}, (error) => {
return null;
});
}
这里的问题是两个返回语句。他们试图返回lambda表达式。但我希望他们做的是回到" makeMyRequest"方法。如何才能做到这一点?更重要的是,如果它完成了。这将是一个非常缓慢的方法。有没有办法做到这一点" async"或类似的。我目前在.NET 2.0环境中工作,因此我无法访问一些较新的异步技术。
答案 0 :(得分:2)
我猜你需要这样的东西:
private resultObject makeMyRequest()
{
requestObject request = new requestObject();
resultObject returnValue = null
MakeRequest(request,
(result) => { returnValue = result; },
(error) => { });
return returnValue;
}
(仅当MakeRequest(...)同步时才有效。)
如果MakeRequest是异步的话,这应该可以解决问题:
private resultObject makeMyRequest()
{
requestObject request = new requestObject();
AutoResetEvent autoEvent = new AutoResetEvent(false);
resultObject returnValue = null
MakeRequest(request,
(result) => {
returnValue = result;
autoEvent.Set();
},
(error) => {
autoEvent.Set();
});
autoEvent.WaitOne();
return returnValue;
}
备注:如果您不希望线程被阻止,您可以返回包含自动重置事件和结果的自定义对象,以便稍后等待。
完整的例子
private async resultObject makeMyRequest()
{
requestObject request = new requestObject();
var returnValue = new PromiseResult(new AutoResetEvent(false));
MakeRequest(request,
(result) => {
returnValue.Result = result;
returnValue.Event.Set();
},
(error) => {
returnValue.Event.Set();
});
return returnValue;
}
public class PromiseResult {
public resultObject Result {get;set;}
public AutoResetEvent Event {get;}
public PromiseResult(AutoResetEvent are){
Event = are;
}
}
public class Example{
public void Test(){
var promise = makeMyRequest();
while(true){
if (promise.Event.WaitOne(0)){
Console.WriteLine(promise.Result);
return;
}
else
{
Console.WriteLine("Not ready yet ..., but the thread is free to do some other stuff");
System.Threading.Thread.CurrentThread.Sleep(500);
}
}
}
}