Есть ли способ ожидания внешнего события в долговременной функции без повторного выполнения длительной задачи - PullRequest
1 голос
/ 28 февраля 2020

У меня есть проблема, которая требует немедленного выполнения длительной задачи, а затем быстрой задачи, выполняемой на более позднем этапе с использованием результата длительной задачи. Я думал, что смогу сделать что-то подобное с Azure долговременной функцией:

[FunctionName("MyFunction")]
public static async Task RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var myThing = LongRunningTask();

    var result = await context.WaitForExternalEvent<object>("SomeEvent");

    myThing.DoSomething(result);
}

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

Есть ли способ достичь того, что я хочу, с помощью долговременных функций - или какого-либо другого типа ресурса? К сожалению, в этом случае результат долгосрочной задачи (myThing выше) не может быть сериализован, что, я думаю, упростило бы вещи.

Ответы [ 2 ]

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

Вы не должны выполнять ничего, кроме простых, детерминированных c logi c в вашем оркестраторе. Переместите все, что использует ввод-вывод или интенсивно использует процессор, в функции активности. Результаты функций активности записываются и воспроизводятся в оркестраторе без повторного запуска функции активности.

[FunctionName("MyFunction")]
public static async Task RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var myThing = await context.CallActivityAsync<Thing>("LongRunningTask", null);

    var result = await context.WaitForExternalEvent<object>("SomeEvent");

    myThing.DoSomething(result);
}
// Thing needs to be serializable
public class Thing
{
    public string MyData { get; set; }
    public void DoSomething()
    {
        // do something with MyData
    }
}
[FunctionName("LongRunningTask")]
public static async Task<Thing> LongRunningTask([ActivityTrigger] IDurableActivityContext context)
{
    // do some long running work
    var result = new Thing { MyData = myResult };
    return result;
}
0 голосов
/ 28 февраля 2020

Попробуйте использовать Task.WhenAll для ожидания нескольких задач.

[FunctionName("MyFunction")]
public static async Task RunOrchestrator(
              [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var myThingTask = Task.Run(() => LongRunningTask());

    var wait =  context.WaitForExternalEvent<object>("SomeEvent");

    await Task.WhenAll(myThingTask, wait); //Both task and external event completed.

    var myThing = await myThingTask;  //Get the result from task (Its completed)

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