异步调用WCF方法

时间:2016-04-01 12:22:01

标签: c# wcf asynchronous

我正在寻找有关以下代码的反馈。我已阅读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中注销项目时,它似乎在等待从调用返回对象时同步运行。

我错过了一些明显的东西吗?或者我完全误解了它是如何工作的。

2 个答案:

答案 0 :(得分:1)

CallMethodAsync是正确的。

如果您没有等待(或等待)resultFromMethodCall,则该任务仍在运行时将继续执行。你是否应该允许这取决于你想要发生什么。

答案 1 :(得分:0)

  

但是,当我从变量resultFromMethodCall中注销项目时,它似乎在等待从调用返回的对象时同步运行。

如果您使用resultFromMethodCall.Result来获取商品,那么是的,它会阻止并同步运行。

如果您使用await resultFromMethodCall来获取商品,那么不,它不会同步运行。但是,它正在顺序运行 - 这意味着该方法将暂停&#34;暂停&#34;在await,仅在resultFromMethodCall任务完成时继续。