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