Как устроить асинхронные и обычные методы c#
При написании приложения не планировались асинхронные задачи, но под конец появилась необходимость поработать с БД асинхронно, теперь получается так, что основная задача заканчивается быстрее чем асинхронный метод, а мне нужно их как-то синхронизировать. Переписать асинхронный метод не вариант, потому что использую асинхронную библиотеку из-за того, что в ней есть все нужные методы работы с БД. Фактически задача выглядит так: разблокировать кнопку на формах после окончания асинхронного void метода.
Метод формы (в нем вызывается InfluxDatabaseMethods.Init())
private void metroButton1_Click(object sender, EventArgs e)
{
string bestAlgNameForDay = logicClass.SearchBestForConc(logicClass.day);
bestAlgConc.Text = bestAlgNameForDay;
dataClass.Init();
InfluxDatabaseMethods.Init();
buttonOpenGrafana.Enabled = true;
}
InfluxDatabaseMethods.Init();
async public static void Init()
{
for (int i = 0; i < dataClass.countOfElements; i++)
{
var valMixed = new InfluxDatapoint<InfluxValueField>();
valMixed.UtcTimestamp = DateTime.UtcNow;
valMixed.MeasurementName = "AlgTwo";
double temp = logicClass.ValuesLog2[i];
valMixed.Fields.Add("value", new InfluxValueField(temp));
var r = await client.PostPointAsync(nameDB, valMixed);
}
}
Получается, что buttonOpenGrafana.Enabled = true; выполняется раньше, чем закончится InfluxDatabaseMethods.Init();
Ответы (1 шт):
Тип асинхронного метода у вас void, а асинхронные методы этого типа ожидать не получится. И ожидание await возможно только в async методах, поэтому:
1) сделайте обработчик события асинхронным
private async void metroButton1_Click(object sender, EventArgs e)
{
string bestAlgNameForDay = logicClass.SearchBestForConc(logicClass.day);
bestAlgConc.Text = bestAlgNameForDay;
dataClass.Init();
await InfluxDatabaseMethods.InitAsync();
buttonOpenGrafana.Enabled = true;
}
2) дайте асинхронному методу тип Task
public static async Task InitAsync()
{
for (int i = 0; i < dataClass.countOfElements; i++)
{
var valMixed = new InfluxDatapoint<InfluxValueField>();
valMixed.UtcTimestamp = DateTime.UtcNow;
valMixed.MeasurementName = "AlgTwo";
double temp = logicClass.ValuesLog2[i];
valMixed.Fields.Add("value", new InfluxValueField(temp));
var r = await client.PostPointAsync(nameDB, valMixed);
}
}
Я переименовал метод Init в InitAsync в соответствии с рекомендациями Microsoft по именованию асинхронных (awaitable) методов.