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

Как я могу изменить код, чтобы вызвать метод `Install()` из класса `Update` из метода `Main()` в классе `Program`, учитывая неправильный тип возвращаемого значения?
  • 6 мая 2024 г. 1:50
Ответы на вопрос 2
Для вызова асинхронного метода, который находится в другом файле, необходимо сначала создать экземпляр этого класса, а затем вызвать этот метод с помощью оператора await.

Пример вызова метода `Install()` из класса `Update` в файле `Update.cs`:

```csharp
public class Update
{
    public async Task Install()
    {
        // код метода Install()
    }
}
```

Теперь, чтобы вызвать этот метод из метода `Main()` в классе `Program`, нужно сделать следующее:

```csharp
class Program
{
    static async Task Main()
    {
        Update update = new Update();
        await update.Install();
    }
}
```

Если вы обнаружили, что метод `Install()` возвращает неправильный тип значений (например, `void` вместо `Task`), то вам нужно изменить его в файле `Update.cs` следующим образом:

```csharp
public class Update
{
    public void Install()
    {
        // код метода Install()
    }
}
```

Затем в методе `Main()` вам нужно изменить вызов метода `Install()` следующим образом:

```csharp
class Program
{
    static async Task Main()
    {
        Update update = new Update();
        await Task.Run(() => update.Install());
    }
}
```

Таким образом, вы можете вызвать метод `Install()` из класса `Update` в методе `Main()` класса `Program`, преобразовав его возвращаемый тип значений соответственно.
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). Это не влияет на другие методы
То есть, он тут бессмысленнен.
Похожие вопросы