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

3

我正在编写一个使用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);
    }

当URL被打开时,它会打印出以下行:
{"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; }
}

我注意到以下错误信息,我尝试在谷歌上搜索并没有找到任何可以理解的解决方案来解决这个问题。

解析正无穷大值时出错。路径“”,行 0,位置 0。


不要只写下异常信息,要倾倒整个异常 (Debug.WriteLine (exc)): 这将为您提供整个异常堆栈跟踪,包括您的代码中出现错误的行:这将帮助您大大了解您的错误。 并且通常情况下,不要像您正在做的那样吞掉异常: 您的程序出现了错误,您只是将其写下并忽略它: 如果前一个方法未执行预期操作,您的程序该如何继续正常运行? - Gian Paolo
我尝试过了,没有发现任何异常(调试控制台 https://pastebin.com/hCU4BxVn )。 - Kingbluesapphire
2个回答

7
你遇到的错误是 JSON.net 的错误,而且发生在解析 JSON 时,这意味着静态变量的更新没有问题,因为代码从未到达那一点(它停在 catch (Newtonsoft.Json.JsonReaderException readerExp))。
这相当明确地限定了你的问题。你从服务器接收到的响应很可能有问题。在 var jsonReader = ... 行上设置断点,并检查 page_result 变量的内容,看看是否包含任何意外字符。你还可以将响应转储到 JSON 验证器中以确认其实际是否有效(https://jsonlint.com/)。

1
谢谢,那确实有帮助!这也是因为它是异步的,并且在加载网页时已经加载了下一页,因此在更新值之前。 - Kingbluesapphire
太棒了,很高兴能帮到你。祝你编程愉快! - Martin Zikmund

0

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

public static volatile string username = "";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接