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;
}