【发布时间】:2018-01-05 15:35:38
【问题描述】:
我有一个使用异步函数 GetParametersByPathAsync 的库(在此处定义:https://github.com/aws/aws-sdk-net/blob/master/sdk/src/Services/SimpleSystemsManagement/Generated/_mobile/AmazonSimpleSystemsManagementClient.cs#L2718)
我有一个库函数定义为
Task<Dictionary<string,string>> GetAllParameters(string region)
{
var pars = DoParameterGatheringWork(reigion);
...(do some more work)
return dict;
}
调用另一个方法
async Task<Dictionary<string,string>> DoParameterGatheringWork(string region)
{
...
var response = await GetParametersByPathAsync(requestObj);
... (process the response)
return parameterDict;
}
在GetParametersByPathAsync 上等待并收集东西。
这是一个问题,因为GetAllParameters 必须由我的服务从静态构造函数调用并初始化参数Dictionary<string,string> MyParameters { get; }
我想在库中的某个位置停止这种冒泡的任务,因此它可以只公开Dictionary<string,string> GetAllParameters(string region),而不是任务版本。 (我对它变得同步完全没问题..)
我认为我不应该只做Task.Wait() 或Task.Result,因为这会导致死锁。
也许这不是最好的方法,但我不确定如何从这里继续。
任何想法将不胜感激!
编辑:
这是我想要的构造函数代码:
public class MyConfiguration
{
static MyConfiguration()
{
...
Parameters = ServiceConfiguration.GetAllParameters(); // (library call)
}
public static Dictionary<string, string> Parameters { get; }
}
客户只需通过MyConfiguration.Parameters["IAMAPARAMETER"]就可以在任何地方使用它
【问题讨论】:
-
听起来你在找Async Initialization
-
所以你只想同步调用一个异步函数?
-
@DavidG 是的。但不会遇到死锁问题。
-
@JSteward 这看起来不错。我会调查一下谢谢
-
@smbl 为什么你想停止冒泡?同步意味着阻塞。 阻塞 会浪费 CPU,因为它通常在使线程进入睡眠状态之前从 spinwaiting 开始。尤其是在云场景中,您不会阻塞或烧毁 CPU 什么都不做。现在甚至控制台应用程序都有
async Task Main()。
标签: c# asynchronous async-await task