Stealch
@Stealch
Админ, мотобродяга.

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

Как мне вызвать ЭТО
public class Update
    {
        /// <summary>
        /// Точка входа для обновления.
        /// </summary>
        [STAThread]
        public async Task Install()
        {

ОТСЮДА:
static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main() //КРИТИЧНО
        {
            
            Update update = new Update();
            Thread thread = new Thread(update.Install); // Task Update.Install() имеет неправильный возвращаемый тип.

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
};
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
Stealch
@Stealch Автор вопроса
Админ, мотобродяга.
А ларчик-то просто открывался!
public class Program
    {
        /// <summary>
        /// Точка входа обновления.
        /// </summary>
        public static async Task GetUpdate()
        {
            Update update = new Update();
            await update.Install();
        }
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            GetUpdate().Wait();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
};
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
Task (задача) - это не Thread. Это спрецифичный для исполняющей системы (CLR) .NET объект, который позволяет отследить завершение выполнения операции, выполняющейся независимо от вашего основного потока управления и получить результат выполнения, если он есть (в вышем случае результата нет). Для запуска задачи, которую возвращает асинхронный метод (в отличие от вновь созданного объекта задачи - new Task(...)) ничего делать не нужно - она уже запущена исполняющей системой. Поток (Thread) для ее выполнения, если он нужен (а нужен он не всегда, иногда задача завершается внутри асинхронного метода синхронно) обычно берется из пула потоков (но могут быть нюансы, если они вам интересны - читайте про SynchronizationContext).
Если вам нужно дождаться выполнения задачи в синхроннном коде (у вас сейчас такой), то следует использовать метод задачи Wait(), но он заблокирует основной поток. Альтернатива для современного .NET (7.3 для этого достаточно современный) - использовать асинхронный метод Main: просто указать static async Task Main() вместо static void Main. Тогда можно дожидаться выполнения Install асинхронно, с помощью операции await: await update.Install(); При этом основной поток блокироваться не будет, но если ему все равно делать нечего (это зависит от типа приложения), то выигрыша от этого не будет (в консольном приложении, например).
PS Зачем вы применили атрибут [STAThread] к метод Install? Ведь, согласно документации
Примените этот атрибут к методу точки входа (Main()метод в C# и Visual Basic). Это не влияет на другие методы
То есть, он тут бессмысленнен. И вообще, это - тяжкое наследие технологии OLE2/COM.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы