2013-06-26 44 views
0

我想從我的Windows Phone 7.5中的服務器獲取數據,併爲此我使用Json.net。我想返回從服務器收到的returnType值,但我不不知道如何返回它。我嘗試了很多方法,但無法返回正確的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; 
} 

返回類型的值應該返回13在我的代碼,但它的返回0.Please告訴我,我應該如何實現這個獲得返回類型的正確值。

+0

嗯,這意味着JSON響應不符合您的'ErrorResponse'對象 –

+0

沒有的結構,其實我在的errorCode得到正確的價值。但我無法使用returnType變量返回該值。 –

+0

Json沒有問題。它工作正常,我得到正確的價值,但問題是如何返回該值? –

回答

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嘗試在UI線程上執行回調,而該回調會阻止互斥體。因此,它將無法工作,並且您將不得不重新考慮您的代碼或在一個線程中執行它。

編輯:啓動一個線程,讓我們假裝你的按鈕調用了一個 「DoSomething的」 方法:

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

(您可能需要添加using System.Threading;上:

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

通過將其更換文件頂部)

然後,您的代碼將在後臺線程中執行,您將能夠使用上述的互斥鎖。兩個注意事項:

  • 由於您的代碼將在後臺線程中執行,所以UI仍會響應。因此,例如,當您的代碼仍在執行時,用戶將能夠在按鈕上再次點擊。根據您的需要,您可能需要顯示某種進度指示器並阻止某些用戶交互。
  • 無法從後臺線程修改UI控件。如果您嘗試這樣做,則會引發無效的跨線程異常。爲了防止這種情況,請使用Dispatcher.BeginInvoke來更新控件。例如:

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

thanx兄弟,但我仍然面臨着一個問題... –

+0

@ user1928849和那個問題是? –

+0

問題已經在您的答案中提到過了。由於我從Button內部調用getUserRegister,因此此方法無效。 –