假设我有以下方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf()
.disable()
.authorizeRequests()
.regexMatchers("/secured.*")
.authenticated()
.and()
.authorizeRequests()
.regexMatchers("/")
.permitAll()
.and()
.httpBasic()
.authenticationEntryPoint(authenticationEntryPoint)
.and()
.addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
.addFilterBefore(logoutFilter, LogoutFilter.class);
}
我这样称呼它:
public async Task<bool> DoSomeStuffWithAsync()
{
//do some stuff without calling await
return true;
}
此方法的运行方式是否与此不同:
await DoSomeStuffWithAsync();
被这样称呼:
public bool DoSomeStuff()
{
return true;
}
我认为,由于DoSomeStuff();
实际上并未在其代码中调用DoSomeStuffWithAsync
,因此它仍将与await
相同地运行。
构造像DoSomeStuff
这样的方法有什么好处吗?
答案 0 :(得分:4)
请注意,对于不使用async
的方法使用await
被认为是不好的风格。如果您有返回任务的同步方法,则应改用Task.FromResult
:
public Task<bool> DoSomeStuffWithAsync()
{
return Task.FromResult(true);
}
但是,仅此而已:一种返回任务的同步方法。它没有什么非同步的,因此它实际上与仅返回布尔值的普通同步代码没有任何不同。
直接返回任务而不是直接返回值还有好处吗?那要看。有时,您可能需要实现一个异步接口,但实际上并没有异步实现。但是,如果不必这样做,并且也不想最终改变实现以实际地异步执行某项操作,那么使方法返回任务就没有任何好处。
对于呼叫,await DoSomeStuffWithAsync()
将运行DoSomeStuffWithAsync()
,然后等待它返回的任务。由于DoSomeStuffWithAsync()
是同步的,因此该任务将直接返回,并且由于该任务已经完成,因此await
将能够直接继续。因此,这与同步调用方法非常相似。 await
的存在确实会影响运行时行为,因为这会使调用方法实际上是异步的(即使被调用的代码是同步的)。
但是由您自己决定是否适合您的情况。但总的来说,当不涉及真正的异步过程时,您可能应该避免使其显得异步。
答案 1 :(得分:1)
简而言之,dat[, idp1 := id + 1]
dat[dat, on=c("idp1"="id","boro","block"), end_date := i.date]
dat
# id boro block date idp1 end_date
# 1: 1 1 1 01/01/1991 2 01/01/1992
# 2: 1 1 2 01/01/1991 2 01/01/1992
# 3: 1 2 3 01/01/1991 2 01/01/1992
# 4: 1 2 4 01/01/1991 2 NA
# 5: 2 1 1 01/01/1992 3 01/01/1993
# 6: 2 1 2 01/01/1992 3 01/01/1993
# 7: 2 2 3 01/01/1992 3 NA
# 8: 2 2 5 01/01/1992 3 NA
# 9: 3 1 1 01/01/1993 4 NA
#10: 3 1 2 01/01/1993 4 NA
#11: 3 2 6 01/01/1993 4 NA
#12: 3 2 7 01/01/1993 4 NA
关键字不能使方法异步运行。它仅允许该方法在内部调用async
关键字。那就是魔术发生的地方。在您的情况下,任何地方都没有任何await
关键字,这表明您的方法实际上并非异步运行。