2013-06-26 3 views
0

Я хочу получить данные с сервера в своем телефоне Windows 7,5 и для этого я использую Json.net. Я хочу вернуть значение возвращаемого значения, которое я получил с сервера, но я не знаю Не знаю, как вернуть его. Я пробовал разными способами, но не смог вернуть правильное значение returnType.Как вернуть значение внутри Json

Пожалуйста, посмотрите на мой код -

public static int getUserRegister(UserDetails userInfo) 
    { 
     int returnType = 0; 
     var client = new RestClient(StaticVariables.APIBASEURL + StaticVariables.USERREGISTRATION); 

     var request = new RestRequest("", Method.POST); 

     request.AddHeader("Authorization", 1 + ";" + appIdKey.AppId + ";" + appIdKey.AppKey); 

     request.RequestFormat = DataFormat.Json; 

     request.AddObject(userInfo); 

     try 
     { 
      client.ExecuteAsync(request, response => 
      { 
       if (response.StatusCode == HttpStatusCode.OK) 
       { 

        var d = JsonConvert.DeserializeObject<ErrorResponse>(response.Content); 

        errorCode = d.ErrorCode; 

        if (errorCode == 13) 
        { 
         returnType = errorCode; 
         //return errorCode; 
        } 

       } 
      }); 
     } 
     catch(Exception e) 
     { 

     } 
     return returnType; 
} 

Значение ReturnType должен вернуть 13 в моем коде, но это возвращение 0.Please сказать мне, как я должен это реализовать, чтобы получить правильное значение ReturnType.

+0

Ну, это означает, что ответ JSON не соответствует структуре вашего объекта 'ErrorResponse' –

+0

Нет, На самом деле я получаю правильное значение в ERRORCODE. Но я не могу вернуть это значение, используя переменную returnType. –

+0

Нет проблем с Json.It работает правильно, и я получаю правильное значение, но проблема в том, как вернуть это значение? –

ответ

1

Если вы звоните getUserRegister из вторичного потока, вы можете использовать семафор, чтобы держать выполнение вызывающего, пока значение не доступно:

var mutex = new ManualResetEvent(false); 

client.ExecuteAsync(request, response => 
{ 
    try 
    { 
     // Put your logic here 
     returnType = errorCode; 
    } 
    finally 
    { 
     mutex.Set(); 
    } 
}); 

mutex.WaitOne(); 

return returnType; 

Однако, если вы звоните getUserRegister от UI (например, после того, как пользователь нажал кнопку), тогда код будет заторможен: RestClient пытается выполнить обратный вызов в потоке пользовательского интерфейса, который вы блокируете с помощью мьютекса. Следовательно, это не сработает, и вам придется либо передумать свой код, либо выполнить его в потоке.

Edit: Для того, чтобы начать нить, давайте представим, что ваша кнопка вызова метода "DoSomething":

private void Button_Click(object sender, EventArgs e) 
{ 
    DoSomething(); 
} 

заменить его:

private void Button_Click(object sender, EventArgs e) 
{ 
    var thread = new Thread(DoSomething); 
    thread.Start(); 
} 

(вы, возможно, придется добавить using System.Threading; на вверху вашего файла)

Тогда ваш код будет выполнен в фоновом потоке, и вы сможете использовать мьютекс, как описано выше. Два оговорки:

  • Поскольку ваш код будет выполнен в фоновом потоке, пользовательский интерфейс все равно будет реагировать. Таким образом, пользователь сможет, например, щелкнуть второй раз на кнопке, пока ваш код все еще выполняется. В зависимости от ваших потребностей вы можете отображать какой-то индикатор прогресса и предотвращать некоторые взаимодействия с пользователем.
  • Элемент управления пользовательского интерфейса не может быть изменен из фоновой нити. Если вы попытаетесь это сделать, будет выбрано недопустимое исключение перекрестного потока. Чтобы предотвратить это, используйте Dispatcher.BeginInvoke для обновления элементов управления. Например:

    Dispatcher.BeginInvoke(() => this.textbox.Text = "Hello world!"); 
    
+0

thanx bro, но я все еще сталкиваюсь с проблемой ... –

+0

@ user1928849 и эта проблема? –

+0

Проблема, о которой вы уже говорили в своем ответе. Поскольку я вызываю getUserRegister изнутри Button, этот подход не работает. –

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