Предположим, я нахожусь в устойчивой функции и хочу вызвать функцию подчиненного оркестратора следующим образом:
context.CallSubOrchestratorAsync("FunctionName","InstanceId",Object);
Прямо сейчас, даже если я не поставлю await
перед вызовом, устойчивая функция будет ждать, пока этот вспомогательный оркестратор не завершит работу. Есть ли способ избежать этого? Я просто хочу вызвать функцию и забыть об этом.
Вы не можете совсем забыть о задачах, но вам не нужно ждать их, прежде чем двигаться дальше, например
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(() => LongTask(1000)).ConfigureAwait(false);
Ваш ответ работает в устойчивых функциях? Вопрос касается «Durable Sub Orchestrator», вы говорите о подфункциях.
Есть ли способ завершить метод, вызвавший задачи, если сама задача не завершена?