Ниже приведен обновленный предыдущий ответ для выхода на вход.
#include <stdio.h>
#define MAX 100
int main()
{
int n, i, array[MAX];
char num[MAX];
int res;
printf("Enter a list of integers [ctrl+d] to end\n");
for(i = 0; i <= MAX; ++i){
printf("> ");
fgets(num, sizeof(num), stdin);
res = sscanf(num, "%d", &n);
if(res != 1)
break;
n = atoi(num);
array[i] = n;
}
puts ("");
int z;
for (z = 0; z < i; z++)
printf("The array is %d\n", array[z]);
return 0;
}
Я рекомендую вам начать с ввода в async
/ await
и следить за официальной документацией MSI в TAP .
Как я упоминал в своем вступительном сообщении в блоге, есть несколько Task
членов, которые являются задержками с TPL и не используют чистый код async
. new Task
и Task.Start
следует заменить на Task.Run
(или TaskFactory.StartNew
). Аналогично, Thread.Sleep
следует заменить на Task.Delay
.
Наконец, я рекомендую вам не использовать Task.WaitAll
; ваше консольное приложение должно просто Wait
на одном Task
, которое использует Task.WhenAll
. При всех этих изменениях ваш код будет выглядеть так:
class Program
{
static void Main(string[] args)
{
MainAsync().Wait();
}
public static async Task MainAsync()
{
Task task1 = Task1();
Task task2 = Task2();
await Task.WhenAll(task1, task2);
Debug.WriteLine("Finished main method");
}
public static async Task Task1()
{
await Task.Delay(5000);
Debug.WriteLine("Finished Task1");
}
public static async Task Task2()
{
await Task.Delay(10000);
Debug.WriteLine("Finished Task2");
}
}
Класс задачи - это асинхронная оболочка задачи. Thread.Sleep (1000) может остановить поток, выполняющийся в течение 1 секунды. Хотя Task.Delay (1000) не остановит текущую работу. См. Код:
public static void Main(string[] args){
TaskTest();
}
private static void TaskTest(){
Task.Delay(5000);
System.Console.WriteLine("task done");
}
При запуске сразу будет отображаться «задача выполнена». Поэтому я могу предположить, что каждый метод из Task должен быть асинхронным. Если я заменю TaskTest () на Task.Run (() => TaskTest ()) выполненная задача не будет отображаться вообще, пока я не добавлю консоль. ReadLine (); после метода Run.
Внутренне класс Task представляет состояние потока в машине состояния. Каждое состояние в конечной машине имеет несколько состояний, таких как «Пуск», «Задержка», «Отмена» и «Стоп».
Теперь вы можете задаться вопросом, является ли вся Task асинхронной, цель Task.Delay? next, давайте действительно задерживаем текущий поток, используя async и ожидаем
public static void Main(string[] args){
TaskTest();
System.Console.WriteLine("main thread is not blocked");
Console.ReadLine();
}
private static async void TaskTest(){
await Task.Delay(5000);
System.Console.WriteLine("task done");
}
async tell caller, я асинхронный метод, не ждите меня. ожидание внутри TaskTest () требует ожидания асинхронной задачи. Теперь, после запуска, программа будет ждать 5 секунд, чтобы показать текст, выполненный по заданию.
Поскольку Task является конечным автоматом, должен быть способ отменить задачу в то время как задача запущена.
static CancellationTokenSource tokenSource = new CancellationTokenSource();
public static void Main(string[] args){
TaskTest();
System.Console.WriteLine("main thread is not blocked");
var input=Console.ReadLine();
if(input=="stop"){
tokenSource.Cancel();
System.Console.WriteLine("task stopped");
}
Console.ReadLine();
}
private static async void TaskTest(){
try{
await Task.Delay(5000,tokenSource.Token);
}catch(TaskCanceledException e){
//cancel task will throw out a exception, just catch it, do nothing.
}
System.Console.WriteLine("task done");
}
Теперь, когда программа запущена, вы можете ввести «стоп», чтобы отменить задачу «Задержка».
Ваши задачи никогда не заканчиваются, потому что они никогда не запускаются.
Я хотел бы Task.Factory.StartNew
создать задачу и запустить ее.
public static async Task Task1()
{
await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromSeconds(5)));
Debug.WriteLine("Finished Task1");
}
public static async Task Task2()
{
await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromSeconds(10)));
Debug.WriteLine("Finished Task2");
}
Как побочная заметка, если вы действительно просто пытаетесь сделать паузу в асинхронном методе, нет необходимости блокировать весь поток, просто используйте Task.Delay
public static async Task Task1()
{
await Task.Delay(TimeSpan.FromSeconds(5));
Debug.WriteLine("Finished Task1");
}
public static async Task Task2()
{
await Task.Delay(TimeSpan.FromSeconds(10));
Debug.WriteLine("Finished Task2");
}
Async и ждут маркеры, которые отмечают позиции кода, из которых элемент управления должен возобновиться после завершения задачи (потока). Вот подробное видео youtube, которое объясняет концепцию демонстративно http://www.youtube.com/watch?v=V2sMXJnDEjM
Если вы хотите, вы также можете прочитать это coodeproject, которая объясняет это более наглядно. http://www.codeproject.com/Articles/599756/Five-Great-NET-Framework-4-5-Features#Feature1:- «Асинхронный» и «Await» (Codemarkers)