c# - 在 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);
}
解决方案
异步是粘性的。你不能只有一部分是异步的——如果你想使用一个返回的方法Task<string>
,那么你需要异步和await
结果。而你不想成为async void
,因为那是 Bad™ - 你的方法可能是async Task
相反的。消费者也需要这样做。等等。但:
string[] parameters = new[] {
await GetParameter(uncleanedUrl, param1),
await GetParameter(uncleanedUrl, param2)
};
推荐阅读
- java - Fitnesse wiki 页面元数据不会在服务器重新启动时保留
- batch-file - 变量中的变量
- ubuntu - 在 Ubuntu 16.04 上,运行“import tensorflow”会生成“ImportError: No module named tensorflow”错误
- java - mousePressed 不会在 JPanel 上响应
- solr - 如何运行更高级的邻近搜索?
- ruby-on-rails - 如何将循环变量从循环传递到控制器?
- python - 如何获取洞察指标 Facebook Graph API?
- microsoft-cognitive - 可以创建自定义情绪来匹配一个人的面部表情吗?
- mysql - MySQL:触发器产生 Table not found 异常
- recursion - Prolog 相互递归谓词