C# 属性的异步初始化

C# 属性的异步初始化,c#,asynchronous,ref,C#,Asynchronous,Ref,我试图用异步方法重构加载单个属性。 加载程序的功能如下所示: public static async Task<Preferences> GetPreferences( string key ) ... 我有一大堆这样的调用,想隐藏和重用ContinueWith、Convert等。我想出了这个函数 public static void LoadPreferenceAsync( string key, ref bool store ) { GetPreferences( ke

我试图用异步方法重构加载单个属性。 加载程序的功能如下所示:

public static async Task<Preferences> GetPreferences( string key ) ...
我有一大堆这样的调用,想隐藏和重用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);
无法使用“无法在匿名方法、lambda表达式、查询表达式或本地函数内使用ref、out或in参数‘store’进行编译”


那么,推荐的方法是什么呢?我不想等待任务,这样它就可以在后台发生,我可以并行加载它们。不要使用不安全的代码或指针,因为这是一个
Xamarin
应用程序,
Xamarin
没有这些东西已经太不稳定了。

这不是一个优雅的解决方案,也没有经过测试,但你可以将你的函数重写为

public static void LoadPreferenceAsync(string key, Action<Task<Preferences>> continueAction){
     GetPreferences(key).ContinueWith(task => continueAction);
}
publicstaticvoidloadpreferenceasync(字符串键,actioncontinueAction){
GetPreferences(键).ContinueWith(任务=>continueAction);
}
然后像这样使用它:

Action<Task<Preferences>> continueAction = task => App.MayUploadStale = Convert.ToBoolean(task.Result?.Value);
LoadPreferenceAsync("SettingsUploadStale", continueAction);
Action continueAction=task=>App.MayUploadStale=Convert.ToBoolean(task.Result?.Value);
LoadPreferenceAsync(“SettingsUploadStale”,continueAction);
您可以等待任务并并行加载它们。试一试

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

不要使用
ContinueWith
。使用
wait
。可能有用吗?将完整的类型定义放在lambda的参数部分,应该可以。谢谢。我希望每套房子都有一个内衬是的,lambda看起来是唯一的办法
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