Информация об изменениях

Сообщение Re: async / await от 23.05.2017 7:52

Изменено 23.05.2017 7:54 Sinatr

Re: async / await
Здравствуйте, Iso12, Вы писали:

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