Сообщение Re: async / await от 23.05.2017 7:52
Изменено 23.05.2017 7:54 Sinatr
Re: async / await
Здравствуйте, Iso12, Вы писали:
I>
Так делать не надо, никогда не делайте асинхронные обертки для синхронных методов, caller может сам создать Task или вызвать метод из уже созданного. Просто сделайте синхронный метод, если используются синхронные методы для доступа к бд.
I>
Снова не правильно. Чтобы получить результат вызова асинхронного метода см. Task.Result (есть нюансы с контекстом). В частности ваш метод можно переписать как-то так:
Проще всего сделать методы MyRequestToBD...() синхронными и вызывать их последовательно.
Если запросы 1 и 2 можно выполнить одновременно, то имеет смысл вызывать их паралельно, к примеру:
I>
public async Task<bool> MyRequestToBDAsync()
{
return await Task<bool>.Run(() =>
{
Func1();
return Func2();
});
}
Так делать не надо, никогда не делайте асинхронные обертки для синхронных методов, caller может сам создать Task или вызвать метод из уже созданного. Просто сделайте синхронный метод, если используются синхронные методы для доступа к бд.
I>
private void WorkFunc()
{
Task.Run(async () =>
{
var dat1 = await MyRequestToBDAsync1();
var dat2 = await MyRequestToBDAsync2();
NeedLongTime(dat1, dat2);
});
}
Снова не правильно. Чтобы получить результат вызова асинхронного метода см. Task.Result (есть нюансы с контекстом). В частности ваш метод можно переписать как-то так:
private void WorkFunc()
{
var dat1 = MyRequestToBDAsync1().Result; // ждем
var dat2 = MyRequestToBDAsync2().Result; // ждем
NeedLongTime(dat1, dat2);
}
Проще всего сделать методы MyRequestToBD...() синхронными и вызывать их последовательно.
Если запросы 1 и 2 можно выполнить одновременно, то имеет смысл вызывать их паралельно, к примеру:
private void WorkFunc()
{
var task1 = Task.Run(() => MyRequestToBD1());
var task2 = Task.Run(() => MyRequestToBD2());
Task.WaitAll();
NeedLongTime(task1.Result, task2.Result);
}
Re: async / await
Здравствуйте, Iso12, Вы писали:
I>
Так делать не надо, никогда не делайте асинхронные обертки для синхронных методов, caller может сам создать Task или вызвать метод из уже созданного. Просто сделайте синхронный метод, если используются синхронные методы для доступа к бд.
I>
Снова не правильно. Чтобы получить результат вызова асинхронного метода см. Task.Result (есть нюансы с контекстом). В частности ваш метод можно переписать как-то так:
Проще всего сделать методы MyRequestToBD...() синхронными и вызывать их последовательно.
Если запросы 1 и 2 можно выполнить одновременно, то имеет смысл вызывать их паралельно, к примеру:
I>
public async Task<bool> MyRequestToBDAsync()
{
return await Task<bool>.Run(() =>
{
Func1();
return Func2();
});
}
Так делать не надо, никогда не делайте асинхронные обертки для синхронных методов, caller может сам создать Task или вызвать метод из уже созданного. Просто сделайте синхронный метод, если используются синхронные методы для доступа к бд.
I>
private void WorkFunc()
{
Task.Run(async () =>
{
var dat1 = await MyRequestToBDAsync1();
var dat2 = await MyRequestToBDAsync2();
NeedLongTime(dat1, dat2);
});
}
Снова не правильно. Чтобы получить результат вызова асинхронного метода см. Task.Result (есть нюансы с контекстом). В частности ваш метод можно переписать как-то так:
private void WorkFunc()
{
var dat1 = MyRequestToBDAsync1().Result; // ждем
var dat2 = MyRequestToBDAsync2().Result; // ждем
NeedLongTime(dat1, dat2);
}
Проще всего сделать методы MyRequestToBD...() синхронными и вызывать их последовательно.
Если запросы 1 и 2 можно выполнить одновременно, то имеет смысл вызывать их паралельно, к примеру:
private void WorkFunc()
{
var task1 = Task.Run(() => MyRequestToBD1());
var task2 = Task.Run(() => MyRequestToBD2());
Task.WaitAll(new[] {task1, task1});
NeedLongTime(task1.Result, task2.Result);
}