异步初始化属性

时间:2018-08-27 10:08:50

标签: c# asynchronous ref

我正在尝试使用异步方法重构加载各个属性。 加载程序功能是这样的:

Platform.OS

目前这样使用

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

我有很多这样的电话,想隐藏并重用ContinueWith,Convert等。我想出了这个功能

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

无法使用进行编译的内容“无法在匿名方法,lambda表达式,查询表达式或局部函数内使用ref,out或in参数'store'”。

那么推荐的方法是什么?我不想public static void LoadPreferenceAsync( string key, ref bool store ) { GetPreferences( key ).ContinueWith( task => store = Convert.ToBoolean( task.Result?.Value ) ); } LoadPreferenceAsync( "SettingsUploadStale", ref App.MayUploadStale); 任务,以便它可以在后台发生,而我可以并行加载它们。不想使用不安全的代码或指针,因为这是一个await应用程序,而Xamarin太不稳定了,没有这些东西。

2 个答案:

答案 0 :(得分:1)

可以等待任务并并行加载它们。试试

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

答案 1 :(得分:0)

这不是一个优雅的解决方案,未经测试,但您可以将函数重写为

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);