Заполнение строкового массива внутри функции asyn c in C# - PullRequest
3 голосов
/ 22 февраля 2020

У меня есть строка [] parameters, которая заполняет свои значения, вызывая другую функцию GetParameter для получения параметров из URL. Я думаю, что мне нужно преобразовать другую функцию в асинхронный режим c, чтобы гарантировать, что параметры будут получены в первую очередь перед запуском остальной части начальной функции (наряду с другими частями метода, которые я должен гарантировать, выполняются в первую очередь).

    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();
                    }
                }
            }
        }
    }

Я пытаюсь следовать этой статье по реализации задачи, но я не уверен, как вернуть строку HttpUtility.ParseQueryString(url).Get(paramName) из задачи.

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 Ответ

2 голосов
/ 22 февраля 2020

Асин c клей. Вы не можете просто иметь одну часть asyn c - если вы хотите использовать метод, который возвращает Task<string>, тогда you должны быть asyn c и await результаты. И вы не хотите быть async void, так как это Bad ™ - вместо этого ваш метод может быть async Task. И потребитель , который должен сделать аналогичным образом. И так далее. Но:

string[] parameters = new[] {
    await GetParameter(uncleanedUrl, param1),
    await GetParameter(uncleanedUrl, param2)
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...