Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET web API中切换同步和异步行为_C#_Multithreading_Asynchronous - Fatal编程技术网

C# 在.NET web API中切换同步和异步行为

C# 在.NET web API中切换同步和异步行为,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我被要求实现如下内容: public async Task<IHttpActionResult> Get(bool sync) { if(sync) { ...sync behavior } else { ...async behavior } } 公共异步任务获取(bool-sync) { 如果(同步) { …同步行为 }否则 { …异步行为 } } 现在,我了解了同步/异步行为和线程的基本知识,并担心可能

我被要求实现如下内容:

public async Task<IHttpActionResult> Get(bool sync)
{
    if(sync)
    {
        ...sync behavior
    } else
    {
        ...async behavior
    }
}
公共异步任务获取(bool-sync)
{
如果(同步)
{
…同步行为
}否则
{
…异步行为
}
}

现在,我了解了同步/异步行为和线程的基本知识,并担心可能出现的问题(异步代码同步运行、线程阻塞、返回任意任务以匹配方法签名通常是草率的,等等),但还不足以肯定这段代码是个坏主意。所以,我的问题是:这总是一种不好的做法,还是在某些情况下可以这样做?

异步方法将同步运行,直到它们到达一个
wait
。如果
wait
正在等待结果,则返回控件

因此,只要异步路径使用wait,代码就没有问题


但需要注意的是,异步方法不必等待任何长时间运行的操作,它将同步执行!因此,即使使用wait,也不能保证控件会返回。

出于各种原因,最好使用两种不同的方法。如果没有别的,异步方法的命名约定通常是添加
async
后缀,而
GetAsync(sync:false)
看起来很糟糕。另外,当您通过非同步路径时,没有任务等待。嗯,感觉糟透了。这是我确切的回答和反应,谢谢!我的专业情况让它有点复杂,因为我是移动团队中唯一的API开发人员(也是一名初级),我需要能够明确地告诉我的高级团队领导,“不,这不起作用。”特别是,为什么。这种方法的工作方式是否真的存在同步和异步变体,或者,您是否被迫伪造一个或另一个(例如,通过
任务。运行
。等待
。结果
调用)?在大多数情况下,只有一个或另一个,它应该将其“同步”或“异步”推到调用堆栈的更高位置。这两个代码路径几乎相同。一个等待任务并返回结果,另一个触发任务并返回200。虽然在某些情况下,此选项是合适的,但我想不出为什么您希望布尔参数来源于查询参数。等待任务确实需要几到10秒以上的时间。但你的意思是,只要异步路径中有东西在等待,我就不会引入任何危险或不稳定性,而这可以通过使用两种不同的方法来避免?简言之:是的。可以说这在某种程度上是不好的做法。因为调用方不知道该方法将如何反应。但从技术上讲,你是完全安全的。