我是TPL Dataflow
的新手。我有一個需要處理的項目編號列表。一個項目可能有大約8000
項目,我需要獲取項目中每個項目的數據,然後將這些數據推送到5個獨立的服務器中。TPL數據流 - 如何調用行動項目多個項目
這是我到目前爲止編碼。我一直堅持如何將這些數據加載到5臺服務器的步驟。我不確定這是否正確編碼。任何意見非常感謝。
public static bool PushData(string projectId)
{
var linkCompletion = new DataflowLinkOptions
{
PropagateCompletion = true
};
var projectItems = new TransformBlock<ProjectDTO, ProjectDTO>(
dto => dto.GetItemData(dto), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5 });
var itemData = new ActionBlock<ProjectDTO>(
dto => PostEachServerAsync(dto, "server1", "setmemcache"), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5 });
projectItems.LinkTo(projectRules, linkCompletion);
IList<ProjectDTO> dtoList = new List<ProjectDTO>();
dtoList = MemcachedDTO.GetDataByProject(projectId);
foreach (ProjectDTOd in dtoList)
{
projectItems.Post(d);
}
projectItems.Complete();
projectItems.Completion.Wait();
return false;
}
這是我的代碼現在 - 但它不能正確完成 - 誰能告訴我我做錯了什麼?
[HttpGet]
public HttpResponseMessage ReloadItem(string projectQuery)
{
try
{
var linkCompletion = new DataflowLinkOptions
{
PropagateCompletion = true
};
IList<string> projectIds = projectQuery.Split(',').ToList();
IEnumerable<string> serverList = ConfigurationManager.AppSettings["ServerList"].Split(',').Cast<string>();
var iR = new TransformBlock<MemcachedDTO, MemcachedDTO>(
dto => dto.GetIR(dto), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 3 });
var pR = serverList.Select(
i => new { Id = i, Action = new ActionBlock<MemcachedDTO>(dto => PostEachServerAsync(dto, i, "set"), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 3 }) });
List<MemcachedDTO> dtoList = new List<MemcachedDTO>();
foreach (string pid in projectIds)
{
IList<MemcachedDTO> dtoTemp = new List<MemcachedDTO>();
dtoTemp = MemcachedDTO.GetItemIdsByProject(pid);
dtoList.AddRange(dtoTemp);
}
foreach (var action in pR)
{
iR.LinkTo(action.Action, linkCompletion);
}
foreach (MemcachedDTO d in dtoList)
{
iR.Post(d);
}
iR.Complete();
foreach (var action in pR)
{
action.Action.Completion.Wait();
}
return Request.CreateResponse(HttpStatusCode.OK, new { message = projectIds.ToString() + " reload success" });
}
catch (Exception ex)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError, new { message = ex.Message.ToString() });
}
}
如果從您的郵件的1000,你只拿到了998,做檢查的錯誤,也有例外你不知道 – VMAtm