Я пробую асинхронную 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?