【问题标题】:Don't wait when calling Sub Orchestrator - Azure Durable Functions [closed]调用 Sub Orchestrator 时不要等待 - Azure Durable Functions [关闭]
【发布时间】:2020-12-10 18:59:18
【问题描述】:

假设我在一个 Durable Function 中,我希望像这样调用一个 suborchestrator 函数:

context.CallSubOrchestratorAsync("FunctionName","InstanceId",Object);

现在,即使我没有在调用前面加上await,Durable Function 也会等到子编排器完成。我有什么办法可以避免这种情况吗?我只是想调用该函数并忘记它。

【问题讨论】:

    标签: c# azure azure-functions azure-durable-functions


    【解决方案1】:

    你不能完全忘记任务,但你不需要等到它们再继续,例如

    public class TaskRunner
    {
        private List<IAsyncAction> taskList;
        private AsyncActionCompletedHandler handleThreadComplete;
        public TaskRunner()
        {
            taskList = new List<IAsyncAction>();
            handleThreadComplete = new AsyncActionCompletedHandler(HandleThread);
        }
    
        public void RunTasks()
        {
            IAsyncAction t1 = Task.Run(() => LongTask(3000)).AsAsyncAction();
            t1.Completed = handleThreadComplete;
            taskList.Add(t1);
            Console.WriteLine("Started Task 1");
            IAsyncAction t2 = Task.Run(() => LongTask(2000)).AsAsyncAction();
            t2.Completed = handleThreadComplete;
            taskList.Add(t2);
            Console.WriteLine("Started Task 2");
    
            // Start a task and forget about it
            Task.Run(() => LongTask(1000)).ConfigureAwait(false);
            Console.WriteLine("Started Task 3 - Fire and Forget");
        }
    
        public int TaskCount
        {
            get
            {
                return taskList.Count;
            }
        }
        private void HandleThread(IAsyncAction asyncInfo, AsyncStatus asyncStatus)
        {
            taskList.Remove(asyncInfo);
            Console.WriteLine("Task Complete");
        }
        private async Task LongTask(int waitFor)
        {
            Thread.Sleep(waitFor);
            Console.WriteLine("Hello after " + waitFor);
        }
    }
    
    public class Program
    {
        public static async Task Main(string[] args)
        {
            TaskRunner tr = new TaskRunner();
            tr.RunTasks();
            while(tr.TaskCount > 0)
            {
                Console.WriteLine("Running " + tr.TaskCount + " tasks");
                Thread.Sleep(100);
            }
            Console.WriteLine("Tasks Complete");
    
        }
    }
    

    这将允许您继续前进,但是您需要保留对任务的引用,否则它们将被终止。

    【讨论】:

    • 如果任务本身没有完成,我有什么办法可以完成调用任务的方法吗?
    • 你要找的是Task.Run(() =&gt; LongTask(1000)).ConfigureAwait(false);
    • 您的答案是否适用于 Durable Functions?问题是关于“Durable Sub Orchestrator”,您是在谈论子功能。
    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多