C# 重构异步方法
我有一个项目,我们有各种各样的行动目录。在每个动作的核心,可以有一个或多个网络呼叫。因此,核心方法如下所示:C# 重构异步方法,c#,asynchronous,refactoring,C#,Asynchronous,Refactoring,我有一个项目,我们有各种各样的行动目录。在每个动作的核心,可以有一个或多个网络呼叫。因此,核心方法如下所示: public async Task<Result> evaluate(){ //some setup chunk try { responsefromUri = await requestManager.Post(resourceUri, ""); } // The non-ret
public async Task<Result> evaluate(){
//some setup chunk
try
{
responsefromUri = await requestManager.Post(resourceUri, "");
}
// The non-retryable exception will directly trickle up.
catch (RetryableException exception)
{
return BuildFailedCheckResult(
StatusCode.Abandoned,
Check1 + " abandoned. Failed to read the response for resource: " + resourceUri + " with exception: " + exception.Message);
}
if (string.IsNullOrEmpty(responsefromUri))
{
return BuildFailedCheckResult(
StatusCode.Failed,
Check1 + " failed. Empty response for resource: " + resourceUri);
}
try
{
responseJson = JObject.Parse(responsefromUri);
}
catch (JsonReaderException e)
{
throw new InvalidOperationException(Check1 + " check failed parsing resource: " + resourceUri, e);
}
// use responseJson to get data and process further
}
公共异步任务评估(){
//一些设置块
尝试
{
responsefromUri=wait requestManager.Post(resourceUri,“”);
}
//不可重试的异常将直接出现。
捕获(RetryableException异常)
{
返回BuildFailedCheckResult(
状态代码。已放弃,
Check1+“已放弃。无法读取资源“+resourceUri+”的响应,异常为“+exception.Message”);
}
if(string.IsNullOrEmpty(responsefromUri))
{
返回BuildFailedCheckResult(
状态码。失败,
Check1+“失败。资源的响应为空:“+resourceUri”);
}
尝试
{
responseJson=JObject.Parse(responsefromUri);
}
捕获(JsonReaderException e)
{
抛出新的InvalidOperationException(检查1+“检查解析资源失败:”+resourceUri,e);
}
//使用responseJson获取数据并进一步处理
}
每个网络呼叫都有这个块。我想把这个提取出来。现在,我不能这样做,因为有一个等待,要提取它,我需要一个异步方法;但要返回失败的检查结果,我需要一个out变量,这在异步方法中是不允许的。重构这段代码的正确方法是什么?当有多个网络调用时,方法会变得非常冗长。只需将“进一步处理”打包成一个
Func
,例如
public async Task<Result> evaluate(Uri resourceUri, Func<JObject, Result> action)
{
string responsefromUri;
try
{
responsefromUri = await requestManager.Post(resourceUri, "");
}
// The non-retryable exception will directly trickle up.
catch (RetryableException exception)
{
return BuildFailedCheckResult(
StatusCode.Abandoned,
Check1 + " abandoned. Failed to read the response for resource: " + resourceUri + " with exception: " + exception.Message);
}
if (string.IsNullOrEmpty(responsefromUri))
{
return BuildFailedCheckResult(
StatusCode.Failed,
Check1 + " failed. Empty response for resource: " + resourceUri);
}
JObject responseJson;
try
{
responseJson = JObject.Parse(responsefromUri);
}
catch (JsonReaderException e)
{
throw new InvalidOperationException(Check1 + " check failed parsing resource: " + resourceUri, e);
}
return action(responseJson);
}
公共异步任务求值(Uri resourceUri,Func操作)
{
字符串responsefromUri;
尝试
{
responsefromUri=wait requestManager.Post(resourceUri,“”);
}
//不可重试的异常将直接出现。
捕获(RetryableException异常)
{
返回BuildFailedCheckResult(
状态代码。已放弃,
Check1+“已放弃。无法读取资源“+resourceUri+”的响应,异常为“+exception.Message”);
}
if(string.IsNullOrEmpty(responsefromUri))
{
返回BuildFailedCheckResult(
状态码。失败,
Check1+“失败。资源的响应为空:“+resourceUri”);
}
JObject-responseJson;
尝试
{
responseJson=JObject.Parse(responsefromUri);
}
捕获(JsonReaderException e)
{
抛出新的InvalidOperationException(检查1+“检查解析资源失败:”+resourceUri,e);
}
返回操作(responseJson);
}
用法示例:
// Example Usage
public Task<Result> DoStuff()
{
Uri uri = new Uri("http://localhost");
return evaluate(uri, jobject => {
return new Result(jobject["result"]);
});
}
//示例用法
公共任务DoStuff()
{
Uri=新的Uri(“http://localhost");
返回evaluate(uri,jobject=>{
返回新结果(jobject[“Result”]);
});
}
您可以重构代码块,使其位于返回任务的单独私有方法中,并添加一个包含“快乐路径”结果的JsonResult类