Application crash from asynchronous method

I am creating an application that requests a small amount of data from a web server in JSON format, deserializes the data using Json.net and returns a list of the user object. I am debugging an application using an Android phone.

Then a list is created using the created list. It seems that the ui code works with ready-made objects inserted into the list instead of the async method. The asynchronous method crashed the application.

public partial class Membership : ContentPage
{
    int increment = 1;

    public Membership()
    {
        //begin task
        var task = GetMembers(increment);

        //irrelevant stuff happening

        //wait for task to complete to continue execution
        List<Person> people = task.Result;


        // Create the ListView.
        ListView listView = new ListView
        {

            // Source of data items.
            ItemsSource = people,

            // Define template for displaying each item.
            // (Argument of DataTemplate constructor is called for 
            //      each item; it must return a Cell derivative.)
            ItemTemplate = new DataTemplate(() =>
            {
                // Create views with bindings for displaying each property.
                Label nameLabel = new Label();
                Label statusLabel = new Label();


                nameLabel.SetBinding(Label.TextProperty, "name");
                statusLabel.SetBinding(Label.TextProperty, "status");

                // Return an assembled ViewCell.
                return new ViewCell
                {
                    View = new StackLayout
                    {
                        Padding = new Thickness(0, 5),
                        Orientation = StackOrientation.Horizontal,
                        Children =
                            {
                                //boxView,
                                new StackLayout
                                {
                                    VerticalOptions = LayoutOptions.Center,
                                    Spacing = 0,
                                    Children =
                                    {
                                        nameLabel,
                                        statusLabel
                                    }
                                    }
                            }
                    }
                };
            })
        }; 

        // Build the page.
        this.Content = new StackLayout
        {
            Children =
            {
                header,
                listView
            }
        };


    }

And the asynchronous task in question:

async Task<List<Person>> GetMembers(int increment)
{
        string jsonString;

        using (var client = new HttpClient())
        {
            //gets the members from the server in json format
            //increment defines which set of members (1-50, 51-100, etc)
            var responseString = await client.GetStringAsync("GENERIC URL" + "increment=" + increment.ToString());
            jsonString = responseString;
        }

        List<Person> memberList = JsonConvert.DeserializeObject<List<Person>>(jsonString);

        return memberList;
}

Now I tested this code bypassing the async task and creating a list of several predefined People, and it worked just fine.

, task.Result; async, , . .

+4
1

:

" , ".

, , . .Result .Wait() SO-Ticket:

, task.Result /

, .Result. :

public async Task InitializeMembership()
{
    //begin task
    var task = GetMembers(increment);

    //irrelevant stuff happening

    //wait for task to complete to continue execution
    List<Person> people = await task;

    //Do further stuff    
}

, , , , async . , .

+3

Source: https://habr.com/ru/post/1672526/


All Articles