Обновление Xamarin-studio. Async доступен из коробки

В современных приложениях очень важен отклик программы на действия пользователя. Если программа надолго задумалась — возникают вопросы, что же ее так озадачило.

Для упрощения разработки в C# 5.0 введены специальные ключевые слова async/await. Как гласит MSDN:

Модификатор async указывает, что модифицируемые им метод, лямбда-выражение, или анонимного метода являются асинхронными. Эти методы называются асинхронными методами.

До сегодняшнего дня единственной возможность как-то отображать что программа не зависла — было использование традиционных методов асинхронного программирования. Легко можно представить себе ситуацию, когда каскад вложенных вызовов создает больше проблем для разработчика и трудности с отладкой. 

Xamarin добавили поддержку async/await ключевые слова в свою Xamarin Studio. С этим же обновлением появилась возможность выбрать .NET Runtimes в настройках Xamarin.

Новая версия Mono 3.2.0 относительно стабильна, однако иногда появляются неотловимые ошибки, связанные с компиляцией. Решается все полной очисткой проекта и полной перекомпиляцией решения.

Новая версия IDE позволяет разрабатывать асинхронные приложения невероятно просто. Для этого достаточно сравнить как надо было писать код до: 

private void SnapAndPost ()
{
    Busy = true;
    UpdateUIStatus ("Taking a picture");
    var picker = new Xamarin.Media.MediaPicker ();
    var picTask = picker.TakePhotoAsync (new Xamarin.Media.StoreCameraMediaOptions ());
    picTask.ContinueWith ((picRetTask) => {
        InvokeOnMainThread (() => {
            if (picRetTask.IsCanceled) {
                Busy = false;
                UpdateUIStatus ("Canceled");
            } else {
                var tagsCtrl = new GetTagsUIViewController (picRetTask.Result.GetStream ());
                PresentViewController (tagsCtrl, true, () => {
                    UpdateUIStatus ("Submitting picture to server");
                    var uploadTask = new Task (() => {
                        return PostPicToService (picRetTask.Result.GetStream (), tagsCtrl.Tags);
                    });
                    uploadTask.ContinueWith ((uploadRetTask) => {
                        InvokeOnMainThread (() => {
                            Busy = false;
                            UpdateUIStatus (uploadRetTask.Result.Failed ? "Canceled" : "Success");
                        });
                    });
                    uploadTask.Start ();
                });
            }
        });
    });
}

И с использованием ключевых слов async:

private async Task SnapAndPostAsync ()
{
    try {
        Busy = true;
        UpdateUIStatus ("Taking a picture");
        var picker = new Xamarin.Media.MediaPicker ();
        var mFile = await picker.TakePhotoAsync (new Xamarin.Media.StoreCameraMediaOptions ());
        var tagsCtrl = new GetTagsUIViewController (mFile.GetStream ());
        // Call new iOS await API
        await PresentViewControllerAsync (tagsCtrl, true);
        UpdateUIStatus ("Submitting picture to server");
        await PostPicToServiceAsync (mFile.GetStream (), tagsCtrl.Tags);
        UpdateUIStatus ("Success");
    } catch (OperationCanceledException) {
        UpdateUIStatus ("Canceled");
    } finally {
        Busy = false;
    }
}

Примеры взяты из официального анонса в блоге разработчиков. 

Разработчики предлагают посетить вебинар 15 августа Live Webinar: C# Async on iOS and Android

Комментарии

comments powered by Disqus