我正在寻找有关以下代码的反馈。我已阅读here我应该避免使用async void。
因此,我在方法中实现了以下内容。
foreach (var sample in returns)
{
_logger.Debug("Calling async method");
var resultFromMethodCall = CallMethodAsync(uploadReturn);
_logger.Debug("Continuing....");
}
async Task<Tuple<bool,long>> CallMethodAsync(Sample sampleReturn)
{
try
{
Service1Client client = new Service1Client();
Tuple<bool, long> results = await client.ValidateSampleReturnAsync(sampleReturn);
_logger.Debug("call to Sample Return validator completed for sample: {0}", results.Item2);
return results;
}
catch (Exception ex)
{
_logger.Error(ex, "Error occured while calling WCF service");
return new Tuple<bool, long>(false, sampleReturn.Id);
}
}
当我对返回的变量resultFromMethodCall不执行任何操作时,日志记录表明all正在按预期工作。但是,当我从变量resultFromMethodCall中注销项目时,它似乎在等待从调用返回对象时同步运行。
我错过了一些明显的东西吗?或者我完全误解了它是如何工作的。
答案 0 :(得分:1)
CallMethodAsync
是正确的。
如果您没有等待(或等待)resultFromMethodCall
,则该任务仍在运行时将继续执行。你是否应该允许这取决于你想要发生什么。
答案 1 :(得分:0)
但是,当我从变量resultFromMethodCall中注销项目时,它似乎在等待从调用返回的对象时同步运行。
如果您使用resultFromMethodCall.Result
来获取商品,那么是的,它会阻止并同步运行。
如果您使用await resultFromMethodCall
来获取商品,那么不,它不会同步运行。但是,它正在顺序运行 - 这意味着该方法将暂停&#34;暂停&#34;在await
,仅在resultFromMethodCall
任务完成时继续。