2017-02-15 3 views
-5

У меня есть метод с двумя обратными вызовами. Один для ошибки и один для успеха. В настоящее время это выглядит следующим образом:Возвращает значение от лямбда к глобальному методу C#

private resultObject makeMyRequest() 
{ 
    requestObject request = new requestObject(); 

    MakeRequest(request, (result) => 
    { 
     return result; 
    }, (error) => { 
     return null; 

    }); 
} 

Вопрос здесь в двух возвратных отчетности. Они пытаются вернуть лямбда-выражение. Но я хочу, чтобы они вернулись к методу «makeMyRequest». Как это может быть сделано? И тем более, если это будет сделано. Это будет очень медленным методом. Есть ли способ сделать это «async» или аналогичным образом. В настоящее время я работаю в среде .NET 2.0, поэтому у меня нет доступа к некоторым новым асинхронным методам.

+2

Что 'MakeRequest()' вернуть? – haim770

+1

Что такое подпись 'MakeRequest'? –

+0

@ haim770 Ну, это метод, который может потерпеть неудачу или преуспеть. Это веб-запрос. Если он терпит неудачу, он просто возвращает объект ошибки. Но я не возражаю, потому что в этом случае я просто хочу вернуть null в качестве моего примера выше. Но если он преуспеет, он вернет «resultObject» так же, как глобальный метод. – TwoTen

ответ

2

Я думаю, вам нужно что-то вроде этого: (. Это работает только, если 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); 
      } 
     }   
    } 
} 
+0

Это то, что мне нужно. (Нижняя версия). Не возражаете ли вы показать мне пример неблокирующей версии?Что бы было в объекте и т. Д., Поскольку я не могу использовать потоки mulitple или блокировать основной поток для среды, в которой я работаю. Спасибо – TwoTen

+0

Дайте мне минуту –

+0

Спасибо, всего одна проблема. как указано в моем первоначальном вопросе, я использую .NET 2.0. Я получаю следующие ошибки только из класса: «Функция« readonly автоматически реализуемые свойства »недоступна в C# 4. Пожалуйста, используйте язык версии 6 или выше. – TwoTen

Смежные вопросы