web-dev-qa-db-fra.com

Comment puis-je appeler async Method dans par exemple Main ()?

public class test
{
    public async Task Go()
    {
        await PrintAnswerToLife();
        Console.WriteLine("done");
    }

    public async Task PrintAnswerToLife()
    {
        int answer = await GetAnswerToLife();
        Console.WriteLine(answer);
    }

    public async Task<int> GetAnswerToLife()
    {
        await Task.Delay(5000);
        int answer = 21 * 2;
        return answer;
    }
}

si je veux appeler Go dans la méthode main (), comment puis-je faire cela? appelé. 

Mais que faire si je veux l'appeler directement dans la méthode principale? Comment puis je faire ça?

J'ai fait quelque chose comme

class Program
{
    static void Main(string[] args)
    {
        test t = new test();
        t.Go().GetAwaiter().OnCompleted(() =>
        {
            Console.WriteLine("finished");
        });
        Console.ReadKey();
    }


}

Mais il semble que ce soit un blocage total et rien n’est imprimé à l’écran.

48
Larry

Votre méthode Main peut être simplifiée. Pour C # 7.1 et plus récent:

static async Task Main(string[] args)
{
    test t = new test();
    await t.Go();
    Console.WriteLine("finished");
    Console.ReadKey();
}

Pour les versions antérieures de C #:

static void Main(string[] args)
{
    test t = new test();
    t.Go().Wait();
    Console.WriteLine("finished");
    Console.ReadKey();
}

Cela fait partie de la beauté du mot clé async (et des fonctionnalités associées): l'utilisation et la nature déroutante des rappels sont considérablement réduites ou éliminées.

55
Tim S.

Au lieu d'attendre, vous feriez mieux d'utiliser new test().Go().GetAwaiter().GetResult() Cela évitera de placer des exceptions dans AggregateExceptions. Vous pouvez donc entourer votre méthode Go () d'un bloc try catch (Exception ex) comme d'habitude.

23
arviman

Depuis la publication de C # v7.1 asyncmain, des méthodes sont désormais disponibles, ce qui évite de recourir aux solutions de contournement des réponses déjà publiées. Les signatures suivantes ont été ajoutées:

public static Task Main();
public static Task<int> Main();
public static Task Main(string[] args);
public static Task<int> Main(string[] args);

Cela vous permet d'écrire votre code comme ceci:

static async Task Main(string[] args)
{
    await DoSomethingAsync();
}

static async Task DoSomethingAsync()
{
    //...
}
17
DavidG
class Program
{
    static void Main(string[] args)
    {
       test t = new test();
       Task.Run(async () => await t.Go());
    }
}
6
maxspan

Tant que vous accédez à l'objet de résultat à partir de la tâche renvoyée, il n'est pas du tout nécessaire d'utiliser GetAwaiter (uniquement si vous accédez au résultat).

static async Task<String> sayHelloAsync(){

       await Task.Delay(1000);
       return "hello world";

}

static void main(string[] args){

      var data = sayHelloAsync();
      //implicitly waits for the result and makes synchronous call. 
      //no need for Console.ReadKey()
      Console.Write(data.Result);
      //synchronous call .. same as previous one
      Console.Write(sayHelloAsync().GetAwaiter().GetResult());

}

si vous souhaitez attendre qu'une tâche soit effectuée et effectuer un traitement supplémentaire:

sayHelloAsyn().GetAwaiter().OnCompleted(() => {
   Console.Write("done" );
});
Console.ReadLine();

Si vous souhaitez obtenir les résultats de sayHelloAsync et en effectuer le traitement ultérieur: 

sayHelloAsync().ContinueWith(prev => {
   //prev.Result should have "hello world"
   Console.Write("done do further processing here .. here is the result from sayHelloAsync" + prev.Result);
});
Console.ReadLine();

Un dernier moyen simple d’attendre la fonction:

static void main(string[] args){
  sayHelloAsync().Wait();
  Console.Read();
}

static async Task sayHelloAsync(){          
  await Task.Delay(1000);
  Console.Write( "hello world");

}
6
msoliman
public static void Main(string[] args)
{
    var t = new test();
    Task.Run(async () => { await t.Go();}).Wait();
}
1
Sami Hussain

Utilisez .Wait ()

static void Main(string[] args){
   SomeTaskManager someTaskManager  = new SomeTaskManager();
   Task<List<String>> task = Task.Run(() => marginaleNotesGenerationTask.Execute());
   task.Wait();
   List<String> r = task.Result;
} 

public class SomeTaskManager
{
    public async Task<List<String>> Execute() {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost:4000/");     
        client.DefaultRequestHeaders.Accept.Clear();           
        HttpContent httpContent = new StringContent(jsonEnvellope, Encoding.UTF8, "application/json");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpResponseMessage httpResponse = await client.PostAsync("", httpContent);
        if (httpResponse.Content != null)
        {
            string responseContent = await httpResponse.Content.ReadAsStringAsync();
            dynamic answer = JsonConvert.DeserializeObject(responseContent);
            summaries = answer[0].ToObject<List<String>>();
        }
    } 
}
0