2016-05-22 73 views
0

我不明白的是下面的代码片段from MSDN从调用者的角度来看,如何调用与调用同步方法不同的异步方法?

注意,这个方法现在标有新的异步关键字;这是 仅仅是编译器的一个指示器,它让它知道在该方法的 上下文中,关键字await将被视为点 ,其中工作流将控制权返回给其调用方,并在关联任务时再次提取 完成。

与非async方法的工作方式有何不同?

如果我

int x; 
x = SomeNormalFunctionThatReturnsAnInt(); 
Console.WriteLine(x); 

int x; 
Task<int> task = SomeAsyncFunctionThatReturnsAnInt(); 
x = await task; 
Console.WriteLine(x); 

然后从呼叫者的角度看,执行的顺序是完全相同:一个int名为x定义,运行返回int的函数,并且当该函数完成运行时,其返回值设置为x,然后写入控制台。

回答

2

从调用者的角度来看,执行的顺序是完全相同

是和否。

如果您将await所有任务尽快返回给您,然后,则该方法在隔离时会看到相同的“执行顺序”。这实际上是整个async/await - 它允许以非常自然的方式编写大多数异步代码,并且与同等代码类似。

但是,调用者必须意识到它必须是异步的。也就是说,来电者通常使用await,这意味着它必须是async。还有一些额外的麻烦来自异步代码。举一个例子:如果这是在UI线程上执行的,则同步代码知道在SomeNormalFunctionThatReturnsAnIntConsole.WriteLine之间的UI线程上没有其他东西可以执行;但是,异步代码使用await,因此它必须接受任何其他内容都可以在SomeAsyncFunctionThatReturnsAnIntConsole.WriteLine之间的UI线程上执行。所以,从这个背景来看,它是不完全相同;异步方法可能会在其他代码运行时暂停其“执行顺序”。

0

如果您未等待函数x的结果可能未初始化。但是在这里你等待它,所以没有任何区别。

0

你需要有异步和同步一些读看到在性能水平发生了什么,

在你的榜样,你说的方法在AWAIT的排队等候,但让有结果没有什么不同看看下面的代码片段

class Program { 
    private static string result; 

    static void Main() { 
    SaySomething(); 
    Console.WriteLine(result); 
    } 

    static async Task<string> SaySomething() { 
    await Task.Delay(5); 
    result = "Hello world!"; 
    return “Something”; 
    } 
} 

你可以试着计算输出,结果不算什么,为什么?

与我们让主要任务继续,因为我们在返回结果前等待5毫秒的await,看看

https://msdn.microsoft.com/en-gb/library/mt674882.aspx

+0

Task.Delay需要几毫秒而不是几秒钟,如果你想等待5秒钟,这将是Task.Delay(5000) –