[英]Running parallel async tasks?
因此,我一直在搜索StackOverflow / Google,寻找同时运行多个异步任务的不同方法。 在不同方法之间似乎存在很多争论,我只想澄清一下。 我正在编写一个程序来执行JSON POST请求,直到服务器返回状态码200。假设我要并行运行其中的5个任务,直到其中一个返回状态码200。请尽量不要偏离主题,我无法控制服务器! 这是我当前的代码,
static bool status = false;
public static async Task getSessionAsync() {
while(!status) { ... }
}
public static async Task doMoreStuff() {
...
}
public static async Task RunAsync()
{
await getSessionAsync ();
await doMoreStuff();
}
public static void Main (string[] args)
{
Task.WhenAll(RunAsync()).GetAwaiter().GetResult();
}
基本上,我想知道我这样处理是否错误,
public static async Task RunAsync()
{
for(int i = 0; i < 5; i++) {
await getSessionAsync ();
}
await doMoreStuff();
}
假设:
private Task<MySession> GetSessionAsync()
{
// ...
}
选项1
Task.WhenAny
var session = await await Task.WhenAny(Enumerable.Range(0, 5).Select(_ => GetSessionAsync()));
选项2
您可以使用称为Amb
的Rx LINQ方法,该方法将仅观察第一个返回内容的Observable。
var session = await Enumerable.Range(0, 5).Select(_ => GetSessionAsync().ToObservable()).Amb().ToTask();
这不会并行运行:
public static async Task RunAsync()
{
for(int i = 0; i < 5; i++) {
await getSessionAsync ();
}
await doMoreStuff();
}
您必须使用Task.WhenAny()
public static async Task RunAsync()
{
var tasks = new List<Task>();
for(int i = 0; i < 5; i++) {
tasks.Add(getSessionAsync());
}
await Task.WhenAny(tasks);
await doMoreStuff();
}
如果不需要当前上下文(即在编写库而不是前端代码时),请不要忘记在每次等待后使用ConfigureAwait(false)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.