Я думаю, вам нужно что-то вроде этого: (. Это работает только, если MakeRequest (...) является syncronious)
private resultObject makeMyRequest()
{
requestObject request = new requestObject();
resultObject returnValue = null
MakeRequest(request,
(result) => { returnValue = result; },
(error) => { });
return returnValue;
}
Это должно сделать трюк, если 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);
}
}
}
}
Что 'MakeRequest()' вернуть? – haim770
Что такое подпись 'MakeRequest'? –
@ haim770 Ну, это метод, который может потерпеть неудачу или преуспеть. Это веб-запрос. Если он терпит неудачу, он просто возвращает объект ошибки. Но я не возражаю, потому что в этом случае я просто хочу вернуть null в качестве моего примера выше. Но если он преуспеет, он вернет «resultObject» так же, как глобальный метод. – TwoTen