【发布时间】:2018-08-28 23:31:17
【问题描述】:
我已经看到了一些关于异步等待完成的现有问题,但是对我来说没有一个解决方案起作用。
我正在使用 C# 包装器连接到销售人员 https://github.com/developerforce/Force.com-Toolkit-for-NET/
在下面的方法中,我想等待方法 UsernamePasswordAsync 完成执行,以便我可以从 auth 对象中获取值。
public async Task<Token> GetTokenForSalesForce()
{
Token token = null;
try
{
var auth = new AuthenticationClient();
await auth.UsernamePasswordAsync(configuration.Value.ClientId, configuration.Value.ClientSecert,
configuration.Value.SFUsername, configuration.Value.SFPassword,
configuration.Value.SFBaseUrl);
if (!string.IsNullOrEmpty(auth.AccessToken) && !string.IsNullOrEmpty(auth.InstanceUrl))
{
token = new Token
{
BearerToken = auth.AccessToken,
InstanceURL = auth.InstanceUrl,
ApiVersion = auth.ApiVersion
};
}
}
catch (Exception ex)
{
throw ex;
}
return token;
}
public async Task<List<SFDashboardResponse>> GetOrderCountFromSalesForce(Token token)
{
List<SFDashboardResponse> sFDashboardResponses = new List<SFDashboardResponse>();
try
{
var client = new ForceClient(token.InstanceURL, token.BearerToken, token.ApiVersion);
var response = await client.QueryAsync<SFDashboardResponse>("SELECT something ");
var records = response.Records;
}
catch(Exception e)
{
}
return sFDashboardResponses;
}
库中的签名是
public async Task WebServerAsync(string clientId, string clientSecret, string redirectUri, string code, string tokenRequestEndpointUrl)
{
}
问题是当方法等待等待首先执行时,另一个线程执行了原始调用者的另一部分。
我从这里调用它
public IActionResult post()
{
var authtoken = _salesForceService.GetTokenForSalesForce();
var response = _salesForceService.GetOrderCountFromSalesForce(authtoken.Result);
DashboardModel dashboardModel = null;
if (authtoken.Status == TaskStatus.RanToCompletion)
{
fill the object
}
return Ok(dashboardModel);
}
【问题讨论】:
-
我感谢那些对问题投反对票的人,如果你能说明理由就好了
-
永远不要使用
throw ex;,其中ex是捕获的异常。您将丢失堆栈跟踪。只需执行throw;,它将保留堆栈跟踪。如果您唯一要做的就是重新抛出异常,请不要捕获异常。并且在您的代码中不要有一个空的 catch 块。至少,记录异常。 -
@mason 你是对的。记录器正在由另一个人实施。一旦完成,它将在 catch 块中使用。
-
你不是在等待异步任务,所以代码当然会继续。这就是重点。
标签: c# asp.net-core async-await