Populating a string array within a function async in C#

Viewed 807

I have a String[] parameters that gets its values populated by calling another function GetParameter to grab parameters from a URL. I think I need to convert the other function to work async to ensure that the parameters are grabbed first before firing off the rest of the initial function (along with other parts of the method that I need to ensure are complete first).

    private static string GetParameter(string url, stringParamName)
    {
        var indexQuery = url.IndexOf("?");
        var indexParam = url.IndexOf(paramName);

        return (indexQuery != -1 && indexParam != -1) ? HttpUtility.ParseQueryString(url).Get(paramName) : throw new Exception ("Missing query/parameter.");
    }

    private static void MainFunction()
    {
        var param1 = "test1";
        var param2 = "test2";
        var uncleanedUrl = "https://google.com/?test1=12345&test2=678901";
        String[] parameters = { GetParameter(uncleanedUrl, param1), GetParameter(uncleanedUrl, param2) }; //Should be populated like {12345, 67890}
        var validValues = new List<string>();
        int[] expectedParamLength = { 5, 6 };
        const string insertString =
            "USE [MY DB] GO" +
            "INSERT INTO [...]" +
            "([Column 1], [Column 2], [Column 1+2])" +
            "VALUES" +
            "(@Column1, @Column2, @Column3) GO";
        var connectionString = ""; //Connection string here

        for (int i = 0; i < parameters.Length; i++)
        {
            var validValue = int.TryParse(parameters[i].Trim(), out int number); // Returns true if the onversion to an int was succesful
            if (validValue && parameters[i].Length == expectedParamLength[i])
            {
                validValues.Add(parameters[i].Trim());
            }
        }

        if (validValues.Count == parameters.Length) //is number of validated values same as number of parameters we checked
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                using (SqlCommand insertCommand = new SqlCommand(insertString))
                {
                    using (SqlDataAdapter adapter = new SqlDataAdapter())
                    {
                        insertCommand.Parameters.AddWithValue("@Column1", validValues[0]);
                        insertCommand.Parameters.AddWithValue("@Column2", validValues[1]);
                        insertCommand.Parameters.AddWithVAlue("@Column3", validValues[0] + validValues[1]);
                        connection.Open();
                        adapter.InsertCommand.ExecuteNonQuery();
                    }
                }
            }
        }
    }

I'm trying to follow along with this article on implementing a task but I'm not sure how to return a string HttpUtility.ParseQueryString(url).Get(paramName)from the task.

private static Task<string> GetParameter(string url, string paramName)
        {
            var returnedParameter = new TaskCompletionSource<string>();
            GetParameter(url, paramName, success =>
            {
                returnedParameter.SetResult(success);
            });
            return HttpUtility.ParseQueryString(url).Get(paramName);
        }
1 Answers

Async is adhesive. You can't just have one part async - if you want to consume a method that returns Task<string>, then you need to be async and await the results. And you don't want to be async void, as that is Badâ„¢ - your method might be async Task instead. And the consumer of that needs to do likewise. And so on. But:

string[] parameters = new[] {
    await GetParameter(uncleanedUrl, param1),
    await GetParameter(uncleanedUrl, param2)
};
Related