运行没有等待的Task方法

时间:2018-09-13 21:52:00

标签: c# asynchronous async-await

假设我有以下方法:

@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这样的方法有什么好处吗?

2 个答案:

答案 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关键字,这表明您的方法实际上并非异步运行。