异步调用 webservice 方法

Posted

技术标签:

【中文标题】异步调用 webservice 方法【英文标题】:Calling a webservice method asynchronously 【发布时间】:2018-01-23 23:08:17 【问题描述】:

我需要在 Web 服务上异步调用 Register() 方法(使用 C#)。 Web 服务中实际的Register 方法的实现不返回任何值。但如果方法失败,它会抛出异常。鉴于此,请问下面的代码看起来还可以吗?

public void RegisterProduct(string productName)

    await RegisterProductAsync();



private async static Task RegisterProductAsync(string productName)

    try
     
         await myWebService.Register(productName);   
    
    catch(Exception ex)
    
        LogException(ex);
    

感谢您的帮助。

【问题讨论】:

您要求进行代码审查吗?更好的地方是codereview.stackexchange.com。如果您遇到此代码的任何问题,请解释。 (1) 你的async 方法应该返回Task,而不是void。 (2) 日志记录可能应该包括实际捕获的异常。 (3) 为什么调用方法不等待操作? “一发不可收拾”有一种令人讨厌的倾向,嗯,被遗忘了。不要混淆异步操作,要求调用代码知道它们。 【参考方案1】:

我大概会写如下代码:

    private async static Task<int> RegisterProductAsync(string productName)
    
        try
        
            await Task.Run(() => myWebService.Register(productName));
            return 0;
        
        catch (Exception ex)
        
            LogException();
            return 1;
        
    

    public async Task<int> RegisterProduct(string productName)
    
        var result = await RegisterProductAsync(productName);
        return result;
    

一直遵循“异步”规则。

【讨论】:

谢谢 Joe。对不起,我之前没有提到,但是 RegisterProduct() 方法是我的类正在实现的接口的一部分。在接口中,该方法的签名有 void 而不是 Task .【参考方案2】:

添加服务后,我猜你知道生成了一个代理文件。

在代理文件中,您可以记下关联的async 函数,该函数返回System.Threading.Tasks.Task&lt;xxxxxx&gt; 作为返回值。

所以对于Register,您可以在代理文件中记下函数RegisterAsync(string)

您可以调用该函数(在您的情况下为:RegisterAsync(string))进行异步调用。

myWebService.RegisterAsync(productName);

【讨论】:

以上是关于异步调用 webservice 方法的主要内容,如果未能解决你的问题,请参考以下文章

在asp.net里怎样异步调用WebService方法

.net中webservice是同步调用还是异步调用

如何在ASP.net中调用webservice里的一个方法

关于webservice的同时调用的问题?

ASP.net jQuery调用webservice返回json数据的一些问题

java 异步调用方法