Siddharth Rai Ответов: 1

Что такое асинхронный метод C#, возвращается ли он к родительскому методу ?


Привет,

В асинхронном программировании, если метод (Дочерний метод) вызывается "асинхронно", форма внутри метода (родительский метод),
Затем он побежал параллельно. я не в состоянии понять одну вещь -

1.Есть ли у родительского метода какие-либо следы дочернего метода,так что родительский метод может быть осведомлен о том, что выполнение дочернего метода было завершено.

2.Что произойдет с дочерним методом, если выполнение родительского метода будет завершено до выполнения дочернего метода. Будет ли дочерний метод показывать выходные данные.

Что я уже пробовал:

Цитата:
использование системы;
использование системы.Нарезание резьбы;
потоки пространства имен
{
публичная программа статического класса
{
//родительский метод как основной()
публичный статический пустота главный()
{
ThreadPool.QueueUserWorkItem(ChildMethod, 5);
Приставка.WriteLine("Привет, я нахожусь в Родительском методе.");
// Приставка.Линия чтения();
}

// ChildMethod этого метода
private static void ChildMethod(состояние объекта)
{
//wait метод паррэнт besacue должно быть готово перед способ ребенка.
Нить.Спать(1000);
Приставка.WriteLine("Привет, я нахожусь в детском методе.");
Приставка.Линия чтения();
}
}
}

Richard Deeming

Гораздо проще в использовании async методы:
Асинхронное программирование | Microsoft Docs[^]

private static async Task ChildMethod()
{
    await Task.Delay(1000);
    Console.WriteLine("Hi I am in Child Method.");
    Console.ReadLine();
}

static void Main()
{
    Task child = ChildMethod();
    Console.WriteLine("Hi I am in Parent Method.");
    child.GetAwaiter().GetResult();
}


Если вы используете обновленную версию Visual Studio, вы даже можете сделать Main метод async:
static async Task Main()
{
    Task child = ChildMethod();
    Console.WriteLine("Hi I am in Parent Method.");
    await child;
}

1 Ответов

Рейтинг:
0

OriginalGriff

Цитата:
Есть ли у родительского метода какие-либо следы дочернего метода,так что родительский метод может быть осведомлен о том, что выполнение дочернего метода было завершено.
Если объект состояния, передаваемый со вторым аргументом, не содержит каких-либо средств сообщить, что происходит, то до тех пор, пока вы не зарегистрируете дескриптор ожидания, "вызывающая задача" не сможет сказать, что происходит с "дочерней задачей". Класс ThreadPool (System.Нарезание резьбы)[^] - см. раздел "замечания".
Цитата:
Что произойдет с дочерним методом, если выполнение родительского метода будет завершено до выполнения дочернего метода? Будет ли дочерний метод показывать выходные данные.

Это очень сложно: все зависит от того, какой поток инициирует дочерний процесс. Если это основной поток - тот, который выполняется из main метод как в вашем примере - тогда, когда этот поток закончится, то же самое произойдет и со всеми дочерними задачами, независимо от их статуса, и вся память и другие ресурсы будут возвращены обратно в ОС.
Если это не так, то дочерний поток будет продолжаться.