2017-07-07 84 views
0

我一直要求实现这样的:切换同步和异步行为

public async Task<IHttpActionResult> Get(bool sync) 
{ 
    if(sync) 
    { 
     ...sync behavior 
    } else 
    { 
     ...async behavior 
    } 
} 

现在,我明白的同步/异步行为和线程的基本知识,并很担心的事情这可能会出错(异步代码同步运行,线程阻塞,返回一个任意的任务来匹配方法签名通常是草率的,等等......),但还不足以说明此代码是一个坏主意。所以,我的问题:这是否总是不好的做法,或者有没有可能的情况下呢?

+1

由于各种原因,最好有2种不同的方法。如果没有别的办法,异步方法的命名约定通常是添加'Async'后缀,'GetAsync(sync:false)'看起来很讨厌。此外,当您通过非同步路径时,不需要等待。呃,感觉很可怕。 – DavidG

+0

这是我的确切答案和反应,谢谢!我的职业情况稍微复杂一些,因为我是移动团队(和初级)的唯一API开发者,需要能够告诉我的高级团队领导,足够明确,“不,这不起作用。“,特别是为什么。 – dylanthelion

+0

实际上是否存在同步和异步变化以适应此方法的工作方式,或者您是否被迫伪造一个或另一个(例如,通过“Task.Run”或“.Wait”或“.Result”调用)?在大多数情况下,只有一个或另一个,它应该把它的调用栈上的“同步性”或“异步性”推得比这里更高。 –

回答

0

异步方法将同步运行,直到它们达到await。如果await正在等待结果,则返回控制权。

因此,只要异步路径使用await,代码没有任何问题。

但重要的是要注意,这是一个异步方法不等待任何长时间运行的操作,它将被同步执行!所以,即使你使用等待,也不能保证控制权被退回。

+0

等待任务需要几秒钟到10秒以上的时间。但是你说,只要在异步路径上等待着什么,我不会引入任何危险或不稳定性,这会通过使用两种不同的方法来避免? – dylanthelion

+0

总之:是的。人们可以说这是一些不良做法。因为主叫方不知道该方法会如何反应。但从技术上讲,你是完全安全的。 – Iqon