首页 > 解决方案 > 在 C# 中的异步函数中填充字符串数组

问题描述

我有一个 String[] parameters,它通过调用另一个函数GetParameter从 URL 中获取参数来填充其值。我想我需要将另一个函数转换为异步工作,以确保在触发其余初始函数之前先获取参数(以及我需要确保首先完成的方法的其他部分)。

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

标签: c#asp.netpromise

解决方案


异步是粘性的。你不能只有一部分是异步的——如果你想使用一个返回的方法Task<string>,那么需要异步和await结果。而你不想成为async void,因为那是 Bad™ - 你的方法可能是async Task相反的。消费者需要这样做。等等。但:

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

推荐阅读