Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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#_Task_Circuit Breaker - Fatal编程技术网

如何在c#的策略断路器内同时等待多个任务?

如何在c#的策略断路器内同时等待多个任务?,c#,task,circuit-breaker,C#,Task,Circuit Breaker,我找不到这个问题的答案。请帮忙。 场景 我可以使用Task.WhenAll一次等待多个任务。但我希望它在一个策略断路器执行方法中。下面是代码片段。我调用了一个API两次,希望每次都能得到调用结果。如果没有断路器,它就可以工作,我可以在以后的代码中使用结果。但我不明白如何使用Task.whalll在断路器内部调用API var param1 = new Param { Category = Category.Manager, FirstName = "John", Addr

我找不到这个问题的答案。请帮忙。
场景
我可以使用Task.WhenAll一次等待多个任务。但我希望它在一个策略断路器
执行
方法中。下面是代码片段。我调用了一个API两次,希望每次都能得到调用结果。如果没有断路器,它就可以工作,我可以在以后的代码中使用结果。但我不明白如何使用
Task.whalll
在断路器内部调用API

var param1 = new Param
{
    Category = Category.Manager,
    FirstName = "John",
    Address = "Sydney",
};
var param2 = new Param
{
    Category = Category.Officer,
    FirstName = "Adam",
    Address = "Melbourne",
};
工作代码:

var results1 = Task.WhenAll(_apiClient.GetAsync(param1), _apiClient.GetAsync(param2));
//At this point results1 is NOT null and contains 2 items in it
问题:

var results1 = Task.WhenAll(_apiClient.GetAsync(param1), _apiClient.GetAsync(param2));
//At this point results1 is NOT null and contains 2 items in it

您需要存储对
\u policybuircuitter
调用之外的任务的引用

var param1Task = _apiClient.GetAsync(param1);
var param2Task = _apiClient.GetAsync(param2);

Task results = _policyCircuitBreaker.Execute(() => Task.WhenAll(param1Task, param2Task));
要么等待电路断路器调用,要么在完成后使用continuation获取结果

等待示例: 继续示例(对于不能等待的代码路径) 这两个示例都会给出结果-您只需在
whalll
调用中执行它们之前存储对每个任务的引用。这样,您就可以在
任务完成后获得结果


我做了一些假设,因为你的帖子不清楚你要使用什么API,也不清楚执行方法API是什么样子。

一般来说,正如Johnathon Sullinger所说,如果你有一个
任务
,并且想以非阻塞方式获得该
任务的结果,
等待
-等待该
任务
(或使用连续体)是一种方法

假设您的断路器来自何方,原始问题(如下重复)的公式将不会给出您可能想要的异步断路器行为:

var results = _policyCircuitBreaker.Execute(() => Task.WhenAll(param1Task, param2Task));
该公式使用了同步的
.Execute(…)
:通过
调用
.Execute(…)
\u policybuircuitter
将只管理
任务返回
任务
,表示等待内部任务完成。断路器(在此公式中)不会控制您对
\u apiClient.GetAsync(…)
的调用

假设您的意图是断路器应该同时控制调用
\u apiClient.GetAsync(param1)
\u apiClient.GetAsync(param2)
(即响应这些调用可能引发的故障),那么您需要使用Polly的异步本机策略和
.ExecuteAsync()
重载:

var results3 = await _policyCircuitBreaker.ExecuteAsync(() => Task.WhenAll(_apiClient.GetAsync(param1), _apiClient.GetAsync(param2))));

.ExecuteAsync(…)
在对其应用策略行为(在本例中为断路器行为)时,内部等待您提供的代理。

感谢您的建议。我现在可以获得结果。Task.Unwrap(results2)也许吧?如果问题是关于断路器的,也许值得在问题上加上“Polly”来证实这一点。
var results = _policyCircuitBreaker.Execute(() => Task.WhenAll(param1Task, param2Task));
var results3 = await _policyCircuitBreaker.ExecuteAsync(() => Task.WhenAll(_apiClient.GetAsync(param1), _apiClient.GetAsync(param2))));