【问题标题】:Calling a webservice method asynchronously异步调用 webservice 方法
【发布时间】: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) 为什么调用方法不等待操作? “一发不可收拾”有一种令人讨厌的倾向,嗯,被遗忘了。不要混淆异步操作,要求调用代码知道它们。

标签: c# .net async-await


【解决方案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);

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多