Асинхронная инициализация свойств - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь выполнить рефакторинг загрузки отдельных свойств с помощью асинхронного метода. Функция загрузчика такова:

public static async Task<Preferences> GetPreferences( string key ) ...

В настоящее время используется так

GetPreferences( "SettingsUploadStale" ).ContinueWith( task =>
    App.MayUploadStale = Convert.ToBoolean( task.Result?.Value )
);

У меня есть куча этих вызовов, и я хочу скрыть и повторно использовать ContinueWith, Convert и т. Д. Я придумал эту функцию

public static void LoadPreferenceAsync( string key, ref bool store ) {
    GetPreferences( key ).ContinueWith( task =>
        store = Convert.ToBoolean( task.Result?.Value )
    );
}

LoadPreferenceAsync( "SettingsUploadStale", ref App.MayUploadStale);

, который не компилируется с "Невозможно использовать ref, out или в параметре 'store' внутри анонимного метода, лямбда-выражения, запроса или локальной функции" .

Так, каков рекомендуемый способ сделать это? Я не хочу await задач, чтобы это могло происходить в фоновом режиме, и я могу загрузить их все параллельно. Не хочу использовать небезопасный код или указатели, потому что это приложение Xamarin, а Xamarin уже слишком нестабильно без этого.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете ждать задач и загружать их все параллельно. Попробуйте

var taskSettingsUploadStale = GetPreferences("SettingsUploadStale");
var taskSomethingElse = GetPreferences("SomethingElse");
var taskSomeOtherThing = GetPreferences("SomeOtherThing");

Task.WaitAll(taskSettingsUploadStale, taskSomethingElse, taskSomeOtherThing);

App.MayUploadStale = Convert.ToBoolean( taskSettingsUploadStale.Result?.Value);
// get and use remaining results
0 голосов
/ 27 августа 2018

Это не элегантное решение и не проверено, но вы можете переписать свою функцию как

public static void LoadPreferenceAsync(string key, Action<Task<Preferences>> continueAction){
     GetPreferences(key).ContinueWith(task => continueAction);
}

и используйте его как:

Action<Task<Preferences>> continueAction = task => App.MayUploadStale = Convert.ToBoolean(task.Result?.Value);
LoadPreferenceAsync("SettingsUploadStale", continueAction);
...