C# 并行运行一系列方法
我正在连接一个RESTAPI并调用多个端点以获得不同的对象。我为要下载的每种类型创建一个C# 并行运行一系列方法,c#,C#,我正在连接一个RESTAPI并调用多个端点以获得不同的对象。我为要下载的每种类型创建一个RestService: RestService<Agent> agentService = new RestService<Agent>(auth, new AgentApi()); RestService<Ticket> ticketService = new RestService<Ticket>(auth, new TicketApi()); RestS
RestService
:
RestService<Agent> agentService = new RestService<Agent>(auth, new AgentApi());
RestService<Ticket> ticketService = new RestService<Ticket>(auth, new TicketApi());
RestService<Company> companyService = new RestService<Company>(auth, new CompanyApi());
RestService<Contact> contactService = new RestService<Contact>(auth, new ContactApi());
幕后GetAll()
进行大量HttpWebRequest
resquest
因此,我的想法是以某种方式并行调用4GetAll()
调用,因为理论上我可以对RESTAPI发出多个请求,而不是一个接一个的请求
我的一个想法是:
RestResult<Agent> agentResults;
RestResult<Company> companyResults;
RestResult<Contact> contactResults;
RestResult<Ticket> ticketResults;
Parallel.Invoke(
() => agentResults = agentService.GetAll(),
() => companyResults = companyService.GetAll(),
() => contactResults = contactService.GetAll(),
() => ticketResults = ticketService.GetAll()
);
RestResult代理结果;
RestResult companyResults;
restresultcontactresults;
RestResult ticketResults;
并行调用(
()=>agentResults=agentService.GetAll(),
()=>companyResults=companyService.GetAll(),
()=>contactResults=contactService.GetAll(),
()=>ticketResults=ticketService.GetAll()
);
但看起来变量从未初始化过
关于如何处理这个问题有什么建议吗 看看这些问题,看起来和你的问题一样。调用似乎不等待异步操作。而是使用Task.WhenAll等待所有任务完成:
RestResult代理结果;
RestResult companyResults;
restresultcontactresults;
RestResult ticketResults;
var t1=Task.Run(()=>agentResults=agentService.GetAll(历元))
var t2=Task.Run(()=>companyResults=companyService.GetAll(历元));
var t3=Task.Run(()=>contactResults=contactService.GetAll(历元));
var t4=Taks.Run(()=>ticketResults=ticketService.GetAll(历元));
等待任务时(t1、t2、t3、t4);
//结果应该在这里填写
看看这些问题,似乎与您遇到的问题相同。调用似乎不等待异步操作。而是使用Task.WhenAll等待所有任务完成:
RestResult代理结果;
RestResult companyResults;
restresultcontactresults;
RestResult ticketResults;
var t1=Task.Run(()=>agentResults=agentService.GetAll(历元))
var t2=Task.Run(()=>companyResults=companyService.GetAll(历元));
var t3=Task.Run(()=>contactResults=contactService.GetAll(历元));
var t4=Taks.Run(()=>ticketResults=ticketService.GetAll(历元));
等待任务时(t1、t2、t3、t4);
//结果应该在这里填写
编译器警告您变量未初始化,因为编译器不理解Parallel.Invoke()
的语义
因此,编译器只知道向该函数传递一些lambda。但它无法推断他们何时被处决。编译器不知道Parallel.Invoke()。它尤其不知道lambda正在初始化变量
因此,从编译器的角度来看,即使在Parallel.Invoke()
之后,您仍然没有为变量赋值
最简单的解决方案是使用默认值(null
)手动初始化它们:
RestResult agentResults=null;
RestResult companyResults=null;
RestResult contactResults=null;
RestResult ticketResults=null;
并行调用(
()=>agentResults=agentService.GetAll(历元),
()=>companyResults=companyService.GetAll(历元),
()=>contactResults=contactService.GetAll(历元),
()=>ticketResults=ticketService.GetAll(历元)
);
编译器警告您变量未初始化,因为编译器不理解Parallel.Invoke()
的语义
因此,编译器只知道向该函数传递一些lambda。但它无法推断他们何时被处决。编译器不知道Parallel.Invoke()。它尤其不知道lambda正在初始化变量
因此,从编译器的角度来看,即使在Parallel.Invoke()
之后,您仍然没有为变量赋值
最简单的解决方案是使用默认值(null
)手动初始化它们:
RestResult agentResults=null;
RestResult companyResults=null;
RestResult contactResults=null;
RestResult ticketResults=null;
并行调用(
()=>agentResults=agentService.GetAll(历元),
()=>companyResults=companyService.GetAll(历元),
()=>contactResults=contactService.GetAll(历元),
()=>ticketResults=ticketService.GetAll(历元)
);
什么是“它看起来像”呢?它们仍然是空的吗?如果是这样,您确定GetAll()
方法返回了其他内容吗?对不起,我的意思是,当我稍后尝试使用变量时,出现了一个编译错误,说变量未赋值。“看起来像”是什么意思?它们仍然是空的吗?如果是这样,您确定GetAll()
方法返回了其他内容吗?对不起,我的意思是,当我稍后尝试使用变量时,我收到一个编译错误,说变量未赋值。不要认为这是原因,lambdas OP正在传递到Parallel。Invoke()
不是async
。即使GetAll
返回了任务
,也应该将其分配给变量。根据文档Parallel.Invoke
仅在所有操作
都已完成时返回。谢谢,但当我在等待之后尝试使用变量时,我收到一个编译错误,说变量未分配。很抱歉,刚才我很快就将代码转换为代码段,您可以像在自己的示例中那样,将它们分配为“null”,我忽略了这一点。最好在lambda表达式中返回结果并捕获任务结果。但是,正如勒内指出的,我假设您的操作是异步的,这就是问题的原因
RestResult<Agent> agentResults;
RestResult<Company> companyResults;
RestResult<Contact> contactResults;
RestResult<Ticket> ticketResults;
Parallel.Invoke(
() => agentResults = agentService.GetAll(),
() => companyResults = companyService.GetAll(),
() => contactResults = contactService.GetAll(),
() => ticketResults = ticketService.GetAll()
);
RestResult<Agent> agentResults;
RestResult<Company> companyResults;
RestResult<Contact> contactResults;
RestResult<Ticket> ticketResults;
var t1 = Task.Run(() => agentResults = agentService.GetAll(Epoch))
var t2 = Task.Run(() => companyResults = companyService.GetAll(Epoch));
var t3 = Task.Run(() => contactResults = contactService.GetAll(Epoch));
var t4 = Taks.Run(() => ticketResults = ticketService.GetAll(Epoch));
await Task.WhenAll(t1,t2,t3,t4);
//results should be filled here
RestResult<Agent> agentResults = null;
RestResult<Company> companyResults = null;
RestResult<Contact> contactResults = null;
RestResult<Ticket> ticketResults = null;
Parallel.Invoke(
() => agentResults = agentService.GetAll(Epoch),
() => companyResults = companyService.GetAll(Epoch),
() => contactResults = contactService.GetAll(Epoch),
() => ticketResults = ticketService.GetAll(Epoch)
);