Task.Run не может обработать ожидаемые методы - PullRequest
0 голосов
/ 06 февраля 2020

Мы сталкиваемся с ситуацией, когда требуется запустить и выполнить несколько запусков и забыть потоки во время вызова. Тем не менее, наш вызов не выполняется, если асин c методы имеют ожидаемый вызов.

Вот пример. Мы что-то упустили?

public class SomeClass
{

    public async Task Test()
    {
        //Calling synchronously this things works
        await Save(1).ConfigureAwait(false);
        await Save(2).ConfigureAwait(false);
        await Save(3).ConfigureAwait(false);

        //Starting three threads at the same time fails while trying to run var queryResult = await SomeClient.QueryAsync<T>(q).ConfigureAwait(false);
        _ = Task.Run(async () => await Save(1));
        _ = Task.Run(async () => await Save(2));
        _ = Task.Run(async () => await Save(3));
    }

    public async Task<bool> Save(int ct)
    {
        var x = await Update(ct).ConfigureAwait(false);

        return x;
    }

    public async Task<bool> Update(int ct)
    {

        await _someObject.CallingSomeAsyncMethod<dynamic>("Some Query").ConfigureAwait(false);

        await _someObject.CallingSomeAsyncMethod<dynamic>("Some Query").ConfigureAwait(false);

        await _someObject.CallingSomeAsyncMethod<dynamic>("Some Query").ConfigureAwait(false);

        return true;
    }
}

public class SomeObject
{

    public async Task<T> CallingSomeAsyncMethod(string q)
    {
        await Task.Delay(1000).ConfigureAwait(false);
        //OR Any async method which is awaited here just stops the execution

        return queryResult;
    }
}

1 Ответ

1 голос
/ 06 февраля 2020

Если вы хотите запустить несколько задач одновременно, вы должны вызвать методы без await и удерживать задачу. Тогда вы можете сделать await Task.WhenAll(task1, task2, task3, ...);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...