编辑:所以它似乎有方法返回void而不是任务意味着异常传播在错误(意外的?)上下文。 然而,我的IDE(Xamarin)仍然在我的构造函数)行,我叫AttemptDatabseLoad(如何(以及为什么)可以避免在这些异步方法上返回void?
“的说法是不是等待和当前方法 的继续执行被调用完成前踢了大惊小怪。考虑使用'await' 运营商或致电'等待'方法“
为什么它踢这个大惊小怪?当然,使用异步方法的全部目的正是为了让程序在主线程上继续执行。
我读过一段关于异步的内容并等待,因为我需要为正在制作的应用程序加载一些异步数据。我读过大量的地方,认为异步方法返回void(除了触发事件的情况)是不好的做法,并且我理解为什么可以很好地处理任务。 但是,我看不出有什么逻辑错误,所以我的问题是双重的:为什么我现在的代码很差?它应该如何重写?
private const int MAX_CONNECTION_ATTEMPTS = 10;
private int ConnectionAttempts = 0;
//Constructor
public DataLoader()
{
//First load up current data from local sqlite db
LoadFromLocal();
//Then go for an async load from
AttemptDatabaseLoad();
}
public async void AttemptDatabaseLoad()
{
while(ConnectionAttempts < MAX_CONNECTION_ATTEMPTS){
Task<bool> Attempt = TryLoad();
bool success = await Attempt;
if (success) {
//call func to load data into program memory proper
}else{
ConnectionAttempts++;
}
}
}
//placeholder for now
public async Task<bool> TryLoad()
{
await Task.Delay(5000);
return false;
}
在构造函数中的异步调用并没有多大意义 - 新的对象不仅是半未初始化的,你甚至不知道*当*这将是安全的使用。 –
我很困惑。毫无疑问,每当等待被调用时,执行会分裂成一个新的上下文,并继续在主要的上下文中执行?所以AttemptDatabaseLoad()不应该阻止主线程(或调用)线程,因为对象构造将像往常一样快。 –
不,它不会阻止*这是一个问题。你会得到一个对象,可能包含或不包含有效的数据,但你不会有任何的方式知道。你甚至不知道你需要等多久才能使用该对象。尤瓦的回答和克里姆的答案的链接解释热避免这种 –