2014-11-24 2 views
0

Я бы асинхронной вызов функции следующим образом:C# метод асинхронной вызов

Я позвоню метод из основного метода, эта функция должна быть асинхронной, как мне это сделать?

Небольшой пример:

private static void Main(string[] args) 
{ 
    StartDoingNothingAsync(); 
    Console.WriteLine("test"); 
    Console.Read(); 
} 

private static async void StartDoingNothingAsync() 
{ 
    for (var i = 0; i < 5000; i++) 
    { 
     //do something 
    } 
    Console.WriteLine("leaved"); 
} 

Я бы первый выход «тест» до «уезжали», как я могу практиковать это?

ответ

0

Самый простой вариант будет ввести задержку в ваш метод асинхронной:

private static async void StartDoingNothingAsync() 
{ 
    await Task.Delay(1000); 
    // This will be called on a thread-pool thread 
    Console.WriteLine("leaved"); 
} 

Это не гарантии что test будут опубликованы до leaved, но это, кажется, весьма вероятно, будет. Если вы действительно хотите получить гарантию, вам нужно будет что-то передать в StartDoingNothingAsync, после чего вы сообщите после печать test ... но не совсем ясно, чего вы пытаетесь достичь.

Обратите внимание, что методы асинхронизации должны быть почти никогда be void - в основном это доступно только для обработчиков событий async. Сделайте вместо этого метод return Task - таким образом ваш код вызова может узнать, когда он будет завершен. (Даже если вы не использовать тот факт, в данном случае, это хорошая привычка.)

Теперь, когда мы имеем немного больше информации о том, что вы пытаетесь достичь, я бы рекомендовал не делает StartDoingNothingAsync метод асинхронной - просто использовать задачу вместо:

private static void Main(string[] args) 
{ 
    Task task = Task.Run(DoSomething); 
    Console.WriteLine("test"); 
    task.Wait(); 
    Console.Read(); 
} 

static void DoSomething() 
{ 
    // Code to run on a separate thread 
} 
+0

С этим я добьюсь, что метод «StartDoing ...» полностью асинхронный. В этом методе я сделаю несколько сотрудников, которые занимают много времени, например, пишут большой файл. Код в основной функции должен выполняться в потоке, а «StartDoing ...» должен выполняться в другом потоке. Я сокращу код блокировки в основной функции –

+0

@MarcelHoffmann: Если вы просто хотите начать отдельную задачу, используйте 'Task.Run'. Использование 'async' * будет * использовать поток потока пула (в случае tihs), но только после первого' ожидания ', который должен планировать продолжение. Использование 'Task.Run' было бы намного яснее. –

+0

Спасибо за tipp с задачей. На самом деле у меня есть один вопрос. В чем разница между задачами и async/await и где я должен их использовать? Спасибо за ответ ранее. –

0

Вы можете сделать это, как этот

private static void Main(string[] args) 
    { 
     StartDoingNothingAsync(); 
     Console.WriteLine("test"); 
     Console.Read(); 
    } 

    private static async void StartDoingNothingAsync() 
    { 
     await Task.Run(async delegate() 
     { 
      for (var i = 0; i < 5000; i++) 
      { 
       //do something 
      } 
      Console.WriteLine("leaved"); 
     }); 
    } 
0

Вы можете использовать Task для этого. В этом случае вам не нужно указывать свою функцию как async:

private static void Main(string[] args) 
    { 
     new Task(StartDoingNothing).Start(); 
     Console.WriteLine("test"); 
     Console.Read(); 
    } 

    private static void StartDoingNothing() 
    { 
     for (var i = 0; i < 5000; i++) 
     { 
      //do something 
     } 
     Console.WriteLine("leaved"); 
    } 
Смежные вопросы