我正在尝试使用异步方法重构加载各个属性。 加载程序功能是这样的:
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
太不稳定了,没有这些东西。
答案 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);