У меня есть объект с несколькими свойствами, каждое из которых заполняется отдельным оператором выбора SQL.Я хочу выполнить операторы выбора одновременно, но жду возвращения всего объекта, пока каждое свойство не будет иметь данных.Я очень новичок в асинхронности в C #, и мне трудно обдумать это.Это пример того, как я бы сделал это синхронно.
public MyObj GetMyObj()
{
MyObj obj = new MyObj();
using (SqlConnection con = new SqlConnection("connectionString"))
{
con.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = con;
cmd.CommandText = "Select ...";
cmd.CommandType = CommandType.Text;
obj.Prop1 = cmd.ExecuteScalar();
}
}
using (SqlConnection con = new SqlConnection("connectionString"))
{
con.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = con;
cmd.CommandText = "Select ...";
cmd.CommandType = CommandType.Text;
obj.Prop2 = cmd.ExecuteScalar();
}
}
return obj;
}
В идеале я хотел бы создать методы задачи для каждого из этих блоков выбора и подождать, пока полный объект не будет возвращен после завершения (мое базовое понимание взято из статьи Microsoft Async ):
public MyObj GetMyObj()
{
MyObj obj = new MyObj();
var prop1Task = GetProp1();
var prop2Task = GetProp2();
var allTasks = new List<Task>{prop1Task, prop2Task};
while (allTasks.Any())
{
Task finished = await Task.WhenAny(allTasks);
if (finished == prop1Task)
{
allTasks.Remove(prop1Task);
obj.Prop1 = await prop1Task;
} else if (finished == prop2Task)
{
allTasks.Remove(prop2Task);
obj.Prop2 = await prop2Task;
} else
allTasks.Remove(finished);
}
return obj;
}
private async Task<int> GetProp1()
{
int prop1 = 0;
using (SqlConnection con = new SqlConnection("connectionString"))
{
con.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = con;
cmd.CommandText = "Select ...";
cmd.CommandType = CommandType.Text;
prop1 = cmd.ExecuteScalar();
}
}
return prop1;
}
При создании метода GetProp1()
я получаю предупреждение intellisense, что « В этом асинхронном методе отсутствуют операторы« ожидания »и он будет работать синхронно ».
AmЯ правильно выполняю отдельные методы GetProp?Является ли интеллектуальное предупреждение неправильным?Я выполняю несколько операторов select, поэтому изменение этой операции на асинхронный запуск значительно повысит производительность.
Заранее спасибо за любую помощь!