Можно ли дождаться вызова другого метода в c#? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть методы, и первый должен вызываться второй. Либо он может подождать, либо попробовать в l oop. Каков наилучший способ сделать это?

public async Task<IHttpActionResult> First()
{
// I need wait for Second() to be called and get result from it to continue here.
}
// It is not gonna be called from First(), it is a callback from Web.
public IHttpActionResult Second()
{
return Ok();
}

1 Ответ

0 голосов
/ 27 марта 2020

Новый ответ:

public class App
    {
        TaskCompletionSource<int> _tcsSquare;

        public async Task<int> First()
        {
            // I need wait for Second() to be called and get result from it to continue here.
            var result = await _tcsSquare.Task;
            return result;
        }

        // It is not gonna be called from First(), it is a callback from Web.
        public async Task Second(int x)
        {
            await Task.Delay(2000);
            _tcsSquare.SetResult(x * x);
        }

        public void Start()
        {
            _tcsSquare = new TaskCompletionSource<int>();

            var result = Task.Run(() => First());
            Task.Factory.StartNew(() => Second(5));

            Console.WriteLine(result.Result);
        }
    }

Этот код запустит две задачи. Независимо друг от друга. TaskCompletionSource - это предоставление задачи для синхронизации между двумя задачами. Как только second () устанавливает Result с оператором _tcsSquare.Result = ..... Ожидание внутри First() заканчивается.

Вам не нужно l oop или проверять снова каждые несколько секунд. Он может ждать, пока _tcsSquare получит результаты.

Подробнее здесь: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskcompletionsource-1?view=netframework-4.8

Первый ответ:

В асинхронном программировании это обычно для по завершении одна асинхронная операция для вызова второй операции и передачи ей данных.

платформа предлагает использовать функцию ContinueWith.

Вам придется немного изменить свой заказ. Поскольку 2-я функция завершается первой, вы должны вызывать ее на самом деле как первую функцию. Вот как может выглядеть ваш код:

public class App
{
    public async Task<int> Run(Func<int, int> callback)
    {
        // start second() as a Task. 
        var secondTask = Task.Run(() => callback(5));

        // second() has completed
        var result = await secondTask.ContinueWith(
                output =>
                {
                    //use output of second() here using output.Result 
                    return output.Result * output.Result; // 625
                });

        return result;
    }

    public int second(int x)
    {
        return x * x;
    }

    public void Start()
    {
        var result = Run(second).Result;
        Console.WriteLine(result);
    }

}

Подробнее здесь: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.continuewith?view=netframework-4.8

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