Асинхронный метод при нажатии кнопки [дубликат]

Ниже приведен обновленный предыдущий ответ для выхода на вход.

#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;
}
56
задан Omar 6 January 2013 в 02:23
поделиться

4 ответа

Я рекомендую вам начать с ввода в 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");
    }
}
54
ответ дан Ian Kemp 31 August 2018 в 20:42
поделиться

Понять задачу C #, async и ждать

Задача C #

Класс задачи - это асинхронная оболочка задачи. 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 представляет состояние потока в машине состояния. Каждое состояние в конечной машине имеет несколько состояний, таких как «Пуск», «Задержка», «Отмена» и «Стоп».

async и жду

Теперь вы можете задаться вопросом, является ли вся 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");
}

Теперь, когда программа запущена, вы можете ввести «стоп», чтобы отменить задачу «Задержка».

12
ответ дан Andrew Zhu 31 August 2018 в 20:42
поделиться

Ваши задачи никогда не заканчиваются, потому что они никогда не запускаются.

Я хотел бы 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");
}
11
ответ дан MerickOWA 31 August 2018 в 20:42
поделиться

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)

7
ответ дан Shivprasad Koirala 31 August 2018 в 20:42
поделиться
Другие вопросы по тегам:

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