2011-08-29 60 views
1

如果這看起來像我想爲我保存我的問題,但我之前偶然發現了問題,並且似乎它會是一個方便的庫,以便熟悉它,並且我認爲它可以很好地工作針對手頭的問題。使用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)

回答

2

嗯,這裏有一些東西。首先,你應該創建一個類,是一個演員,用:

public class MyServerCoordinator : Actor 
{} 

然後,演員將加載配置和創建另一個演員每個服務器實例。這將允許每個配置的服務器根據自己的時間表檢索信息。

然後你需要爲每種類型的ActorFactory,使用:

var factory = ActorFactory.Create((i,f,s) => new MyServerCoordinator(i,f,s)); 
var actor = factory.GetActor(); 

隨着消息傳遞,你應該爲你想使用原始CLR的行動者之間的交流,而不是每個消息創建一個消息類類型。

另外,在每個參與者的構造函數中,可以設置一個接收循環來處理與預定更新分開的請求。參與者可以通過發送請求(包括向發件人提供響應頻道)相互通信。這將允許每個服務器的演員與協調員進行交談。

MyServerCoordinator(Inbox inbox) 
{ 
    inbox.Loop(loop => 
    { 
     loop.Receive<Request<ServerData>>(request => 
     { 
      request.Respond(new ServerDataResult(_myCurrentValue)); 
      loop.Continue(); 
     }); 
    } 
} 

每個角色都有自己的光纖,所以不需要使用併發的收集類型或任何鎖定機制。 actor模型通過消息傳遞來處理併發,所以不使用信號量等。

您還需要查看單元測試中的一些示例,以瞭解如何使用AnonymousActor.New()內聯聲明與非actor類代碼中的actor進行交互。

+0

我還要指出,Stact在1.0版本中處於尖銳的形式。如果你不小心,你可以削減自己。 :) –

+0

感謝您的指導,我會試一試。希望這一切不會是致命的,不殺你的傷害會讓你變得更強壯! ;) –

+0

如何提供給該演員的收件箱? – Damian