异步调用 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添加服务后,我猜你知道生成了一个代理文件。
在代理文件中,您可以记下关联的async
函数,该函数返回System.Threading.Tasks.Task<xxxxxx>
作为返回值。
所以对于Register
,您可以在代理文件中记下函数RegisterAsync(string)
。
您可以调用该函数(在您的情况下为:RegisterAsync(string
))进行异步调用。
myWebService.RegisterAsync(productName);
【讨论】:
以上是关于异步调用 webservice 方法的主要内容,如果未能解决你的问题,请参考以下文章