抱歉,如果这看起来我想为我保存我的问题,但我前段时间偶然发现了 stact,它似乎是一个方便熟悉的库,我认为它可以很好地解决手头的问题。
我看了一下源代码,里面有很多!:) 不知道从哪里开始。
我需要的是一个组件(Actor?),它会定期发送异步 Web 请求并将结果存储在本地(首先会对结果进行一些解析)。其他线程将在不同时间询问结果。
据我所知,我需要一个调度器、一个光纤和一个通道来处理将结果返回给任何请求它们的人。类似于以下内容:
private static readonly ConcurrentDictionary<Uri, ServerLoad> ServerLoads = new ConcurrentDictionary<string, ServerLoad>();
public Channel<Request<IEnumerable<ServerLoad>>> ServerLoadChannel { get; private set;
public LoadRetriever(Inbox inbox, Fiber fiber, Scheduler scheduler, ILoadBalancerConfiguration config)
{
this.inbox = inbox;
this.fiber = fiber;
this.scheduler = scheduler;
this.scheduler.Schedule(
0,
config.FetchIntervalMilliSecs,
fiber,
() =>
{
foreach (var server in config.Servers)
{
// need someway to send async web request to url in
// server.LoadRetrievalAddress and save/update result
// in ServerLoads dictionary
}
});
this.ServerLoadChannel = new ConsumerChannel<Request<IEnumerable<ServerLoad>>>(this.fiber,
request => request.Respond(ServerLoads.Values));
}
}
这暂时都是理论上的,可能完全错误,我遇到的主要问题是执行异步请求(WebClient.DownloadStringAsync() 和 DownloadStringCompleted)。与 AsyncResultChannel 相反的东西
任何提示/示例/推动正确方向将不胜感激!
(试图为 stact 创建一个标签,但我的声誉不够好:S)