работает - c# task run




Насколько отличается ожидание/асинхронность от потоков? (2)

Вы можете найти ответ на свои вопросы об операторе await в следующем посте Эрика Липперта , где он говорит, что:

Оператор «ожидания»… не означает, что «этот метод теперь блокирует текущий поток до тех пор, пока не вернется асинхронная операция». Это сделало бы асинхронную операцию обратно синхронной операцией, чего мы и пытаемся избежать. Скорее это означает противоположность этому; это означает, что «если задача, которую мы ожидаем, еще не выполнена, зарегистрируйте оставшуюся часть этого метода как продолжение этой задачи, а затем немедленно вернитесь к своему абоненту; задача вызовет продолжение по завершении. - Эрик Липперт

Я пытаюсь ознакомиться с новыми ключевыми словами await / async в c # и обнаружил несколько аспектов, которые не совсем понимаю.

  1. Начнем с условий гонки:

    Stream s=...
    ...
    for(int i=0;i<100;i++)
    {
        s.WriteAsync(new byte[]{i},0,1);
    }

    будет ли это работать все время как положено (например, записать в файл 12345 ..... а не 13254 или что-то в этом роде)?

    Во-вторых, асинхронная функция выполняется синхронно, если она не содержит оператора ожидания. И, согласно документации Microsoft, асинхронные функции всегда выполняются в потоке вызывающего (по сравнению с BeginInvoke). Это подводит меня к 3 следующим вопросам:

  2. Какая часть асинхронной функции выполняется до ее вызова функции вызывающей стороны?

    async void MyAsyncFunction()
    {
        Operation1();
        Operation2();
        Operation3();
        ....
        Stream s=...;
        await s.WriteAsync(....);
    }

    В статьях о await / async, которые я читал, говорится, что асинхронные функции без оператора await выполняются последовательно, а async / await возвращаются неизбежно. Но меня MyAsyncFunction что MyAsyncFunction всегда может выполнить Operation1 ... Operation3 перед выпуском, когда она попадает в await s.WriteAsync .

  3. Что если я использую Thread.Sleep в асинхронной функции следующим образом:

    async void DoStuff()
    {
        Stream s=...;
        ...
        await s.WriteAsync(....);
        Thread.Sleep(10000);
        ....
    }

    Будет ли Thread.Sleep блокировать весь поток, в котором он выполняется, или только асинхронную функцию?

  4. Что если я использую semaphore.Wait() в одной из асинхронных функций, и он будет ожидать освобождения семафора другой асинхронной функцией. Будет ли это вести себя как с потоками, или это приведет к тупику?

  5. await не работает вне асинхронных функций. Зачем?


Короче говоря, похоже, что ответ "очень". Хотя следующее не может ответить на все ваши вопросы, я думаю, что это относится к достаточно общему варианту использования. Подумайте о своем потоке вместо сетевого ввода-вывода, на который они ссылаются.

В случае перекрывающегося сетевого ввода-вывода будет использоваться порт завершения ввода-вывода, при этом обратный вызов запускается аппаратным прерыванием.

Это означает, что пока мы «ждем» завершения, поток не будет использован. [...]

Можно делать все по 1 теме. [...] Однако это будет зависеть от платформы, реализации «ожидающего» и используемого контекста синхронизации.

http://social.msdn.microsoft.com/Forums/en-US/async/thread/a46c8a54-f8d4-4fa9-8746-64d6a3a7540d/





async-await