0

我想从 Windows phone 7.5 中的服务器获取数据,为此我正在使用 Json.net。我想返回从服务器收到的 returnType 值,但我不知道如何返回它。我有尝试了多种方式,但无法返回正确的 returnType 值。

请看我的代码 -

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。请告诉我应该如何实现它以获得正确的 returnType 值。

4

1 回答 1

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)
{
    DoSomething();
}

将其替换为:

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

(您可能必须using System.Threading;在文件顶部添加)

然后您的代码将在后台线程中执行,您将能够使用上面解释的互斥锁。两个警告:

  • 由于您的代码将在后台线程中执行,因此 UI 仍将是响应式的。因此,例如,用户将能够在您的代码仍在执行时再次单击按钮。根据您的需要,您可能希望显示某种进度指示器并阻止某些用户交互。
  • 不能从后台线程修改 UI 控件。如果您尝试这样做,则会引发无效的跨线程异常。为防止这种情况,请使用Dispatcher.BeginInvoke更新您的控件。例如:

    Dispatcher.BeginInvoke(() => this.textbox.Text = "Hello world!");
    
于 2013-06-26T18:44:22.580 回答