2016-04-28 38 views
1

我有一个看起来像这样的代码:运行多个等候在同一时间

firstList = await GetFirstListFilesAsync(); 
textBlock1.Text = "found " + firstList.Count + " first list's results"; 
secondList = await GetSecondListFilesAsync(); 
textBlock2.Text = "found " + secondList.Count + " second list's results"; 
thirdList = await GetThirdListFilesAsync(); 
textBlock3.Text = "found " + thirdList.Count + " third list's results" 

所以,现在它被第一个列表,将第一TextBlock文本,然后它得到第二个列表,设置第二TextBlock文字和然后获取第三个列表并设置第三个TextBlock文本。但我希望所有等待的操作都能同时运行,因此所有TextBlock s都会同时更新或更新。或者可能不是在同一时间 - 每个TextBlock会随着相应的等待方法完成而更新。无论如何,我想在这里实现的目标是更快地获得结果。如果我一个接一个地运行这些方法,他们会一直等到前一个结束,但如果它们同时运行,第三个方法会更快地返回结果,对吗?所以我的问题是 - 这可能吗?如果是,那么如何?

+0

创建一个新的功能,并把GetFirstListFilesAsync,GetSecondListFilesAsync,GetThirdListFilesAsync和返回的所有逻辑int和List <>的数组或字典,并使用await运行该函数。 – progrAmmar

回答

4

我认为这是你在找什么:

var tasks = new Task<MyMethodReturnObject>[3]; 
tasks[0] = GetFirstListFilesAsync(); 
tasks[1] = GetSecondListFilesAsync(); 
tasks[2] = GetThirdListFilesAsync(); 

// At this point, all three tasks are running at the same time. 

// Now, we await them all. 
await Task.WhenAll(tasks); 

// Get an individual result, where result is MyMethodReturnObject 
var myText = tasks[0].Result; 

// Loop through results 
var results = tasks.Select(o => o.Result).ToList(); 
foreach (var result in results) 
{ 
    Console.Write(result); 
} 

来源:http://blog.stephencleary.com/2012/02/async-and-await.html

+0

好的,但我怎样才能使用此分配结果列表? – dace

+0

我的语法可能稍微偏离这里,因为我现在没有访问VS,但是像这样: 'code' var results = tasks.Select(o => o.Result).ToList(); foreach(var result in results) { //对结果做些什么 - result.Count; }'code' – jondow

+0

非常好的回答@jondow。 @dace只是做'firstList = tasks [0] .Result;' – Stamos

1

您可以尝试将工作转移到Task的集合中,并使用Task.WaitAll来加入线程。

+0

或者像把所有的等待放在一起那么简单,然后像这样调用设置的文本值: firstList = await GetFirstListFilesAsync(); secondList = await GetSecondListFilesAsync(); thirdList = await GetThirdListFilesAsync(); textBlock1.Text =“found”+ firstList.Count +“first list's results”; textBlock2.Text =“找到”+ secondList.Count +“第二个列表的结果”; textBlock3.Text =“找到”+ thirdList.Count +“第三个列表的结果” –

1

使用大卫的回答还是一样把所有的等待在一起,然后调用设置文本值这样简单:

firstList = await GetFirstListFilesAsync(); 
secondList = await GetSecondListFilesAsync(); 
thirdList = await GetThirdListFilesAsync(); 

textBlock1.Text = "found " + firstList.Count + " first list's results"; 

textBlock2.Text = "found " + secondList.Count + " second list's results"; 

textBlock3.Text = "found " + thirdList.Count + " third list's results" 
+0

这仍然不会并行运行任务。 'GetSecondListFilesAsync'只有等到GetFirstListFilesAsync产生完成后才会被调用。 –

-1

只需将创建为即可他们:

var firstWait = GetFirstListFilesAsync(); 
var secondWait = GetSecondListFilesAsync(); 
var thirdWait = GetThirdListFilesAsync(); 
firstList = await firstWait; 
textBlock1.Text = "found " + firstList.Count + " first list's results"; 
secondList = await secondWait ; 
textBlock2.Text = "found " + secondList.Count + " second list's results"; 
thirdList = await thirdWait ; 
textBlock3.Text = "found " + thirdList.Count + " third list's results"; 

这仍然不会显示任何结果,直到第一项已完成,但允许并行地取得进展。如果你想处理每一个作为它在一个单一的功能内完成,因为你必须WaitAny关于awaitables的集合,然后确定(手动)哪一个已完成,从那里删除那些收集和循环,直到所有完成。

0

所以你不想分组await块,你想要指定完成后会发生什么。

GetFirstListFilesAsync().ContinueWith(task => { 
    textBlock1.Text = "found " + task.Result.Count + " first list's results"; 
}); 
GetSecondListFilesAsync().ContinueWith(task => { 
    textBlock2.Text = "found " + task.Result.Count + " second list's results"; 
}); 
GetThirdListFilesAsync().ContinueWith(task => { 
    textBlock3.Text = "found " + task.Result.Count + " third list's results"; 
}); 

这样会做到这一点的最快方法,因为一旦Task完成后,您textBlock.Text将被设置,他们将不会在上一代人来完成等待。

0

我希望所有等待的操作都会同时运行,所以所有的TextBlocks都会同时更新或更新。或者可能不在同一时间 - 每个TextBlock将会随着相应的await方法完成而更新。

然后定义了一些新的方法:

private async Task<TFirst> GetFirstListFilesAndDisplayAsync() 
{ 
    var firstList = await GetFirstListFilesAsync(); 
    textBlock1.Text = "found " + firstList.Count + " first list's results"; 
} 

private async Task<TSecond> GetSecondListFilesAndDisplayAsync() 
{ 
    var secondList = await GetSecondListFilesAsync(); 
    textBlock2.Text = "found " + secondList.Count + " second list's results"; 
} 

private async Task<TThird> GetThirdListFilesAndDisplayAsync() 
{ 
    var thirdList = await GetThirdListFilesAsync(); 
    textBlock3.Text = "found " + thirdList.Count + " third list's results"; 
} 

然后同时打电话给他们所有:

var firstTask = GetFirstListFilesAndDisplayAsync(); 
var secondTask = GetSecondListFilesAndDisplayAsync(); 
var thirdTask = GetThirdListFilesAndDisplayAsync(); 

await Task.WhenAll(firstTask, secondTask, thirdTask); 

firstList = await firstTask; 
secondList = await secondTask; 
thirdList = await thirdTask;