Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在导航到其他页面时使用反序列化对象?_C#_Windows Phone 8_Json Deserialization - Fatal编程技术网

C# 如何在导航到其他页面时使用反序列化对象?

C# 如何在导航到其他页面时使用反序列化对象?,c#,windows-phone-8,json-deserialization,C#,Windows Phone 8,Json Deserialization,所以基本上我有一个按钮。当我点击它时,必须发生两件事 1) 获取数据的web请求 2) 导航到其他页面并填充数据 问题是,当应用程序导航到第2页时,app.mydirectories会给出一个nullreferenceException 如何确保App.mydirectories不为null,并在将数据填充到新页面之前等待 private void Button_Click(object sender, RoutedEventArgs e) { makeE

所以基本上我有一个按钮。当我点击它时,必须发生两件事

1) 获取数据的web请求

2) 导航到其他页面并填充数据

问题是,当应用程序导航到第2页时,app.mydirectories会给出一个nullreferenceException

如何确保App.mydirectories不为null,并在将数据填充到新页面之前等待

private void Button_Click(object sender, RoutedEventArgs e)
        {
            makeEventwebRequest(number.Text,date.Text);


            NavigationService.Navigate(new Uri("/page2.xaml", UriKind.Relative));
        }

        public void makeEventwebRequest(string numb, string date)
        {

            string requesturi = string.Format(baseUri, numb, date);
            try
            {
                WebClient client = new WebClient();


                client.DownloadStringCompleted +=
                new DownloadStringCompletedEventHandler(directories_DownloadStringCallback);

                client.DownloadStringAsync(new Uri(requesturi));
            }
            catch (Exception e)
            {
            }

        }
        private void directories_DownloadStringCallback(object sender, DownloadStringCompletedEventArgs e)
        {


                    App.mydirectories = JsonConvert.DeserializeObject<directoriescs>(e.Result);



        }
private void按钮\u单击(对象发送者,路由目标)
{
makeEventwebRequest(number.Text、date.Text);
NavigationService.Navigate(新Uri(“/page2.xaml”,UriKind.Relative));
}
public void makeEventwebRequest(字符串numb,字符串date)
{
stringrequesturi=string.Format(baseUri,numb,date);
尝试
{
WebClient客户端=新的WebClient();
client.DownloadStringCompleted+=
新的DownloadStringCompletedEventHandler(目录\u DownloadStringCallback);
DownloadStringAsync(新Uri(requesturi));
}
捕获(例外e)
{
}
}
私有无效目录\u DownloadStringCallback(对象发送方,DownloadStringCompletedEventArgs e)
{
App.mydirectories=JsonConvert.DeserializeObject(e.Result);
}

发生此错误是因为执行WebRequest的代码是异步的。当您导航到
page2.xaml时,您的数据尚未下载

这是一个关于如何编写代码的示例:

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        await makeEventwebRequest(number.Text,date.Text);
        NavigationService.Navigate(new Uri("/page2.xaml", UriKind.Relative));
    }

    public async void makeEventwebRequest(string numb, string date)
    {
        string requesturi = string.Format(baseUri, numb, date);
        var request = (HttpWebRequest)WebRequest.Create(requesturi );
        var result = await GetHttpResponse(request);
        App.mydirectories = JsonConvert.DeserializeObject<directoriescs>(result);
    }

    // Method helper to Http async request
    public static async Task<String> GetHttpResponse(HttpWebRequest request)
    {
        String received = null;

        try
        {
            using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
            {
                using (var responseStream = response.GetResponseStream())
                {
                    using (var sr = new StreamReader(responseStream))
                    {

                        received = await sr.ReadToEndAsync();
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }

        return received;
    }
private async void按钮\u单击(对象发送方,路由目标)
{
等待makeEventwebRequest(number.Text、date.Text);
NavigationService.Navigate(新Uri(“/page2.xaml”,UriKind.Relative));
}
公共异步void makeEventwebRequest(字符串numb,字符串日期)
{
stringrequesturi=string.Format(baseUri,numb,date);
var request=(HttpWebRequest)WebRequest.Create(requesturi);
var结果=等待GetHttpResponse(请求);
App.mydirectories=JsonConvert.DeserializeObject(结果);
}
//Http异步请求的方法帮助器
公共静态异步任务GetHttpResponse(HttpWebRequest请求)
{
接收到的字符串=null;
尝试
{
使用(var response=(HttpWebResponse)(wait Task.Factory.fromsync(request.BeginGetResponse,request.EndGetResponse,null)))
{
使用(var responseStream=response.GetResponseStream())
{
使用(var sr=新的StreamReader(responseStream))
{
已接收=等待sr.ReadToEndAsync();
}
}
}
}
捕获(例外情况除外)
{
Debug.WriteLine(ex);
}
收到的报税表;
}
您应该阅读一篇关于async/await方法的文章,这样您就可以更好地理解与我的代码不同的地方


基线是您在webrequest仍在生成时导航到page2,而在我上面发布的代码中,执行会等待web请求完成,然后导航到page2。

makeEventWebRequest
也需要是异步的。