[英]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.