2015-04-13 7 views
1

Может кто-нибудь объяснить мне разницу между этими двумя блоками.Два параллельных аргумента ожидания

Это один выполняет около 2 секунд (это означает, что Awaits являются асинхронными.):

[Test] 
    public async void TestAwait() 
    { 
     var sw = new Stopwatch(); 

     sw.Start(); 

     var task = TestAwaiter(5, 2000).ConfigureAwait(false); 

     var task1 = TestAwaiter(10, 2000).ConfigureAwait(false); 

     var i = await task; 

     var j = await task1; 

     Console.WriteLine(i+j); 

     Console.WriteLine(Math.Round(sw.Elapsed.TotalSeconds, 0)); 

     Assert.AreEqual(Math.Round(sw.Elapsed.TotalSeconds, 0), 2); 

     sw.Stop(); 
    } 

    public async Task<int> TestAwaiter(int num, int waitTimeSec) 
    { 
     await Task.Delay(waitTimeSec).ConfigureAwait(false); 

     return num; 
    } 

Этот выполняет около 4 секунд (это означает, что Awaits синхронны.)

[Test] 
    public async void TestAwait() 
    { 
     var sw = new Stopwatch(); 

     sw.Start(); 

     var i = await TestAwaiter(5, 2000).ConfigureAwait(false); 

     var j = await TestAwaiter(10, 2000).ConfigureAwait(false); 

     Console.WriteLine(i+j); 

     Console.WriteLine(Math.Round(sw.Elapsed.TotalSeconds, 0)); 

     Assert.AreEqual(Math.Round(sw.Elapsed.TotalSeconds, 0), 2); 

     sw.Stop(); 
    } 

    public async Task<int> TestAwaiter(int num, int waitTimeSec) 
    { 
     await Task.Delay(waitTimeSec).ConfigureAwait(false); 

     return num; 
    } 

I не могут понять, как они отличаются. Зачем назначать ожидание задачи позже, тогда ее создание влияет на порядок выполнения.

+0

Глупый, глупый меня. – schizofreindly

+0

Какой тестовый бегун вы используете? Как этот тестовый бегун отслеживает запущенную задачу, если вы тестируете методы «async void»? –

+0

NUnit работает безупречно. – schizofreindly

ответ

3

Первый начинает обе задачи перед await «их, вторая« ждет »до завершения первой задачи, а затем запускает вторую.

Первый пример кода:

// starting 2 tasks at 0 seconds 
var task = TestAwaiter(5, 2000).ConfigureAwait(false); 
var task1 = TestAwaiter(10, 2000).ConfigureAwait(false); 

// waiting for task to finish (about 2 second) 
var i = await task; 

// waiting for task1 to finish (likely 0 seconds as already waited 2 from 0) 
var j = await task1; 

Второе:

// waiting for task to finish (about from 0 to 2 second) 
var i = TestAwaiter(5, 2000).ConfigureAwait(false); 

// waiting for task to finish (about from 2 to 4 second) 
var j = TestAwaiter(5, 2000).ConfigureAwait(false); 
1

async метод работает синхронно, пока первый await не будет достигнута. Затем он логически принимает ожидаемую задачу, добавляет остальную часть метода в качестве продолжения и возвращает задачу, представляющую всю операцию.

Когда вы ставите await каждую задачу, вы ожидаете асинхронно ждать завершения задержки до начала второго. Когда вы не задерживаетесь одновременно (так что они занимают половину времени, если они будут выполняться один за другим).

Вы можете упростить пример с этим:

var a = Task.Delay(2000); 
var b = Task.Delay(2000); 

await a; // Waits 2 seconds for first delay. 
await b; // Finished immediately as 2 seconds passed. 

VS:

await Task.Delay(2000); // Waits for 2 seconds 
await Task.Delay(2000); // Waits for another 2 seconds