Когда метод возвращает void, это то же самое, что и задача?

Я пробую асинхронную CTP версии 4.5, которая позволяет использовать асинхронные методы без необходимости писать методы Begin/End.

Мой первый тест — выполнить асинхронный метод, возвращающий void. Я вижу несколько примеров и делаю следующее:

private void btnAsync01_Click(object sender, RoutedEventArgs e)
{
    UpdateTxtLog("click button: " + System.DateTime.Now);
    method01Async();
    UpdateTxtLog("after ethod01Async: " + System.DateTime.Now);
}

private async void method01Async()
{
    await TaskEx.Run(() =>
    {
        UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
        Thread.Sleep(10000);
        UpdateTxtLog("exit method01Async: " + System.DateTime.Now);
    });
}

В моем проекте WPF у меня есть текстовое поле для просмотра результатов и кнопка для выполнения асинхронного метода.

В асинхронном методе я использую await, что необходимо, поскольку метод является асинхронным, и TasEx.Run для создания нового потока, в котором выполняется код.

В этом я сомневаюсь. В нескольких примерах, которые я вижу, как создать асинхронный метод, который возвращает void, используйте этот способ, Task.Run или TaskEx.Run.

Если я не ошибаюсь, Task.Run создает новый поток, в котором выполняется метод. Тогда зачем использовать асинхронный метод, если с Задачей, создавая новый поток, я получаю то, что хочу, а не блокировать основной поток?

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

По сути, я использую один и тот же код без асинхронности и без ожидания, и результат тот же, основная программа не блокируется и все работает так, как я ожидаю.Метод следующий:

private void method01Async()
{
    TaskEx.Run(() =>
    {
        UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
        Thread.Sleep(10000);
        UpdateTxtLog("Exit method01Async: " + System.DateTime.Now);
    });
}

Мой вопрос: это правильный способ использования async, когда метод возвращает void?

8
задан svick 6 April 2012 в 14:12
поделиться