Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行运行一系列方法_C# - Fatal编程技术网

C# 并行运行一系列方法

C# 并行运行一系列方法,c#,C#,我正在连接一个RESTAPI并调用多个端点以获得不同的对象。我为要下载的每种类型创建一个RestService: RestService<Agent> agentService = new RestService<Agent>(auth, new AgentApi()); RestService<Ticket> ticketService = new RestService<Ticket>(auth, new TicketApi()); RestS

我正在连接一个RESTAPI并调用多个端点以获得不同的对象。我为要下载的每种类型创建一个
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

因此,我的想法是以某种方式并行调用4
GetAll()
调用,因为理论上我可以对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)
);