如何从线程内更新字符串值

时间:2018-01-05 22:42:16

标签: c# json multithreading xamarin xamarin.forms

我正在编写一个与用户帐户一起使用的Xamarin.Forms跨平台应用程序。问题是我从我的数据库中获取了他们的用户名,但它并没有更新public static string username = "";

的值

我假设这是因为它是在线程中运行或与WebRequest有关,我已经做了一段时间的安静研究,但一直无法找到解决方案。

我用来更新用户名的方法如下

private void loadUserData()
    {
        username = "Test";
        Uri uri = new Uri("http://example.com/session-data.php?session_id=" + session);
        WebRequest request = WebRequest.Create(uri);
        request.BeginGetResponse((result) =>
        {
            try
            {
                Stream stream = request.EndGetResponse(result).GetResponseStream();
                StreamReader reader = new StreamReader(stream);
                Device.BeginInvokeOnMainThread(() =>
                {
                    string page_result = reader.ReadToEnd();
                    var jsonReader = new JsonTextReader(new StringReader(page_result))
                    {
                        SupportMultipleContent = true // This is important!
                    };
                    var jsonSerializer = new JsonSerializer();
                    try
                    {
                        while (jsonReader.Read())
                        {
                            UserData userData = jsonSerializer.Deserialize<UserData>(jsonReader);
                            username = userData.username;
                        }

                    }
                    catch (Newtonsoft.Json.JsonReaderException readerExp)
                    {
                        string rEx = readerExp.Message;
                        Debug.WriteLine(rEx);
                    }
                });
            }
            catch (Exception exc)
            {
                string ex = exc.Message;
                Debug.WriteLine(ex);
            }

        }, null);
    }

当打开网址时,会打印出以下行

  

{“id”:7,“username”:“TestUser”,“name”:“Test User”,“bio”:“Hello World”,“private”:0}

UserData包含以下代码

class UserData
{
    [JsonProperty("id")]
    public int id { get; set; }

    [JsonProperty("username")]
    public string username { get; set; }

    [JsonProperty("name")]
    public string name { get; set; }

    [JsonProperty("bio")]
    public string bio { get; set; }

    [JsonProperty("private")]
    public int isPrivate { get; set; }
}

我还注意到以下错误打印出来,我尝试使用Google搜索并且找不到任何我理解的解决方案

  

解析正无穷大值时出错。路径'',第0行,第0位。

2 个答案:

答案 0 :(得分:7)

您获得的错误是JSON.net错误,并且在JSON反序列化期间发生,这意味着更新静态变量没有问题,因为代码永远不会到达那一点(它以{{1}结束})。

这很好地缩小了你的问题。您从服务器收到的响应很可能出现问题。在行catch (Newtonsoft.Json.JsonReaderException readerExp)上放置一个断点并检查var jsonReader = ...变量的内容,看它们是否包含任何意外字符。您也可以将响应转储到JSON验证器中以确认它是否实际有效(https://jsonlint.com/

答案 1 :(得分:0)

每个变量都限定在专用于执行其声明的线程的内存中,因此,当您从另一个线程访问该变量时,您正在读取其他线程内存中的该副本。
当线程与另一个线程同步时执行此复制,并且在设置变量时并不总是这样做 因此,您必须在变量声明中添加volatile修饰符,这表示必须在全局同步范围内分配和取消分配变量。
尝试声明您的变量,例如:

public static volatile string username = "";