C# 始终使用';异步';和';等待&x27;库中异步方法中的关键字?

C# 始终使用';异步';和';等待&x27;库中异步方法中的关键字?,c#,.net,asynchronous,async-await,.net-4.6,C#,.net,Asynchronous,Async Await,.net 4.6,摘要:在库方法中,什么时候应该使用异步和等待关键字,而不是直接返回任务 我相信我的问题与我有关。然而,这个问题是关于.NET4.0和TPL的,而我使用.NET4.6的async和wait关键字。所以,我想我的问题可能会得到不同的答案,因为在回答链接问题时,这些关键字并不存在 解释:我正在为一个外部WCF服务编写一个简单的包装器,该包装器进行多个SendAsync调用。现在我认为每个包装器方法应该直接返回一个任务,而不需要等待。我的理解是async/await应该在应用程序层上使用,而不是在库中使

摘要:在库方法中,什么时候应该使用
异步
等待
关键字,而不是直接返回
任务

我相信我的问题与我有关。然而,这个问题是关于
.NET4.0
和TPL的,而我使用.NET4.6的
async
wait
关键字。所以,我想我的问题可能会得到不同的答案,因为在回答链接问题时,这些关键字并不存在


解释:我正在为一个外部WCF服务编写一个简单的包装器,该包装器进行多个
SendAsync
调用。现在我认为每个包装器方法应该直接返回一个
任务
,而不需要等待。我的理解是
async
/
await
应该在应用程序层上使用,而不是在库中使用

例如,下面是我认为应该对每个包装器方法采取的方法:

private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
    return _service.SendAsync(request);
}

那么,我应该在什么时候使用第二种方法(包括
async
await
关键字的方法)?为什么不直接返回整个
任务
,而不执行
PutTaskDelay
async
?我认为只要有可能,我应该直接返回
任务
,并使用
异步
/
等待
仅在应用层获得最终结果。我说得对吗?如果不是,我在这里展示的两种方法之间的区别是什么


我的担忧:当使用
async
await
关键字时,它似乎只是为编译器提供了额外的工作,而没有任何好处。

不要相信我的话,因为我从来都不太理解async/await,但最让我烦恼的是,所有使用async的方法也必须标记为async,这让我非常恼火

我想在一个库中,给人们选择如何使用方法的选项是一件好事,因此您应该使用异步,但是我总是发现直接显式使用任务更为明显

我应该在库中使用async Wait吗

这要看情况而定。如果您打算利用异步编程范例,那么答案是“是”,大多数时候都需要
async
await
关键字。您很可能会发现自己需要使用
async/await
。这是因为在大多数情况下,很难仅使用
任务
任务
,因为您很可能需要对调用的异步操作的结果进行推理

此外,根据您的问题,您似乎对关键字本身以及它们与
任务
任务
类型的关系有些困惑。请允许我为你澄清这一点

关键字允许方法使用关键字。最佳做法是让所有异步方法返回
Task
Task
,除非您无法返回(例如,如上所示的按钮单击事件处理程序)

返回
Task
Task
的方法表示异步操作。当您在库中时,建议始终使用
.ConfigureAwait(false)
,以了解详细原因。此外,我总是在这个问题上给人们指点方向

要区分问题中的两种方法:

下面的方法返回一个
任务
。这是一个异步操作,表示要登录的工作。调用方可以等待该方法以获取
SignResponse

private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
    return _service.SignAsync(request);
}
最后,如果您需要对响应进行推理,可以使用前面提到的关键字进行推理,如下所示:

private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
    var result = await _service.SignAsync(request).ConfigureAwait(false);
    if (result.SomeProperty == SomethingWeCareToCheck)
    {
        _log.Log("Wow, this was un-expected...");
    }
    return result;
}
专用异步任务GetSignDataAsync(SigningRequestType请求)
{
var result=await\u service.SignAsync(请求).ConfigureAwait(false);
if(result.SomeProperty==SomethingWeCareToCheck)
{
_log.log(“哇,这是出乎意料的…”);
}
返回结果;
}

您不完全理解async关键字的含义。无论您是否在代码中使用它,调用方都不会知道。即使运行时本身也没有异步/等待的概念。
async
/
await
是方法的实现细节。就调用方而言,您的方法是声明为
async Task method()
还是仅声明为
Task method()
,一点都不重要。(事实上,你可以在以后的某个时间点自由地在这两者之间进行更改,而不会被认为是一个突破性的更改)@DavidRR谢谢你的编辑。不,当我编写
SignAsync
时,我指的是
async-Sign
方法,因为我调用它是为了在某个认证中心获取字节数组的数字签名。但是我不会编辑这篇文章,因为方法名
签名
发送
都不重要。我认为这个意图实际上是被保留的,所以我要感谢你的一个好工作:“@亚历克斯-我当然同意使用<代码> SeaStYNC < /COD>或<代码> SignAsync <代码>并不是你的问题的中心。如果有人到这里来寻找
SendAsync
SignAsync
,我们的评论应该会消除他们可能产生的任何困惑。实际上,这是个坏主意。该方法要么是同步的,要么不是。使用任务与使用
async/await
没有什么不同,这些关键字只是围绕任务的甜言蜜语。调用方现在永远不会使用标记为
async
的库函数,除非您想使用wait,并且该方法没有标记为async,因此它不会工作:)我的建议是使用async标记方法,因为这将允许两种情况:wait或just Tasks,就像我做的那样。@SideriteZackwehdex-但是关于是否在任何特定方法中使用
async
/
wait
的决定是一个本地决定
private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
    return _service.SignAsync(request);
}
private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
    return await _service.SignAsync(request).ConfigureAwait(false);
}
private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
    var result = await _service.SignAsync(request).ConfigureAwait(false);
    if (result.SomeProperty == SomethingWeCareToCheck)
    {
        _log.Log("Wow, this was un-expected...");
    }
    return result;
}