在ServiceStack中编写异步/等待服务的正确方法
本文关键字:服务 方法 等待 ServiceStack 异步 | 更新日期: 2023-09-27 18:31:56
我正在尝试使用ServiceStack编写异步服务,对我来说,此功能似乎并不完整。
我的问题:
1)服务方式如何传递CancellationTokens
?
2)这些方法的ConfigureAwait(false)
呢?例如
public Task<SomeResponse> Get(SomeRequest request)
{
return _manager.ExecuteAsync(request).ConfigureAwait(false);
}
这不会编译。
3)我们是否应该使用async关键字标记此类服务并返回任务以使它们可等待?例如,这不起作用(用法很愚蠢,但你明白了)
public async Task<SomeResponse> Get(SomeRequest request)
{
return await _manager.ExecuteAsync(request).ConfigureAwait(false);
}
我们甚至应该使用 ServiceStack 编写异步服务吗?是否有好处或当前的实施违背了目的?
谢谢
-
如果这些方法不接受取消令牌,则它们不是可取消的,并且您无法取消它们。
-
您实际上并没有在等待任务,因此无需配置
await
。 只需省略ConfigureAwait
,因为您没有要配置await
。
如果您 实际上不打算利用它的任何功能或用它完成任何尚未通过不这样做来完成的事情,则无需将方法标记为
async
。 除了使代码变慢一点之外,它没有破坏任何东西,但它也没有添加任何东西。
您可以使用 C# async/await 正常发出异步请求,即:
var response = await client.GetAsync(requestDto);
或者,如果您愿意(或不能使用 await),您可以在返回的Task<T>
上使用延续,例如:
client.GetAsync(new Hello { Name = "World!" })
.Success(r => r => r.Result.Print())
.Error(ex => { throw ex; });
您可以使用以下命令取消异步请求:
client.CancelAsync();
这会在幕后调用 HttpWebRequest.Abort()。