Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两级异步等待调用_C#_Async Await - Fatal编程技术网

C# 两级异步等待调用

C# 两级异步等待调用,c#,async-await,C#,Async Await,最近我遇到了一些带有async await的异步代码。我的问题是下面两个代码块之间的区别是什么- 代码块-1 public async Task Method1(string fileName) { await Method2(fileName); } public async Task Method2(string filePath) { await Task.Run(() =>{ //do some task }); } 代码块-2 pub

最近我遇到了一些带有async await的异步代码。我的问题是下面两个代码块之间的区别是什么-

代码块-1

public async Task Method1(string fileName)
{
    await Method2(fileName);
}

public async Task Method2(string filePath)
{
    await Task.Run(() =>{
         //do some task
    });
}
代码块-2

public async Task Method1(string fileName)
{
    await Method2(fileName);
}

public async Task Method2(string filePath)
{
    Task.Run(() =>{
         //do some task
    });
}

这两个代码之间的差异在方法2上有待解决。当第三个方法(比如Method3)调用Method1时会发生什么?从方法3中观察到的执行差异是什么

在第二个代码块中,Method2将在不等待任务的情况下完成。在Method2中运行以完成


这取决于您在实施方面需要什么。例如,如果要在Method2中初始化变量,而被调用方希望初始化此变量,则第二个代码块将导致意外错误。

在第二个代码块中,Method2将在不等待任务完成的情况下完成。请在Method2中运行以完成


这取决于您在实施方面需要什么。例如,如果要在Method2中初始化变量,而被调用方希望初始化此变量,则第二个代码块将导致意外错误。

Method2存在严重问题:

public async Task Method2(string filePath)
{
    Task.Run(() =>{
         //do some task
    });
}
它同步运行并返回一个已完成的
Task
对象(
Task.IsComplete==true
)。在返回之前,它启动另一个任务(使用
task.Run
),该任务异步运行,完成状态结果丢失(“启动并忘记”)。这样说更有意义:

public Task Method2(string filePath)
{
    return Task.Run(() =>{
         //do some task
    });
}

方法2存在严重问题:

public async Task Method2(string filePath)
{
    Task.Run(() =>{
         //do some task
    });
}
它同步运行并返回一个已完成的
Task
对象(
Task.IsComplete==true
)。在返回之前,它启动另一个任务(使用
task.Run
),该任务异步运行,完成状态结果丢失(“启动并忘记”)。这样说更有意义:

public Task Method2(string filePath)
{
    return Task.Run(() =>{
         //do some task
    });
}

对不起,我听不清楚。你能详细解释一下吗?在代码块2中,Method2运行一个任务。假设这项任务需要10秒才能完成。方法2实际上将在任务完成之前完成。这意味着您可以在不等待10秒的情况下运行Method2,同时执行其他操作。。。在代码块1中,任务前面的wait语句指示在执行方法2的其余代码之前,等待任务完成它所做的任何事情。想想方法1。在这两种情况下,控件都会立即返回到method1,因为Task.Run()之后没有任何操作。您的示例是伪代码,请想象这两个任务都在实现一个非常复杂的东西,需要10秒钟。在您的第一个示例中,Method2需要10秒才能完成,因为任务需要这么长的时间。。。在第二个示例中,Method2将立即返回,因为它不会等待任务完成……对不起,我不能清楚地理解。你能详细解释一下吗?在代码块2中,Method2运行一个任务。假设这项任务需要10秒才能完成。方法2实际上将在任务完成之前完成。这意味着您可以在不等待10秒的情况下运行Method2,同时执行其他操作。。。在代码块1中,任务前面的wait语句指示在执行方法2的其余代码之前,等待任务完成它所做的任何事情。想想方法1。在这两种情况下,控件都会立即返回到method1,因为Task.Run()之后没有任何操作。您的示例是伪代码,请想象这两个任务都在实现一个非常复杂的东西,需要10秒钟。在您的第一个示例中,Method2需要10秒才能完成,因为任务需要这么长的时间。。。在第二个示例中,Method2将立即返回,因为它不会等待任务完成……代码#2应该给您一个警告,确切地解释差异是什么。不要忽略来自编译器的警告。@svick谢谢。编译器说该方法缺少等待运算符,将同步运行。现在,想想我提到的方法3。当method3调用method1时,在这两种情况下,在到达等待调用后,控制返回method3。那么,区别是什么呢?区别在于从
Method1
返回的
Task
何时完成。使用#2,它将立即完成(不要等待在
Task.Run()
中启动的
Task
完成)。code#2应该给您一个警告,确切解释区别。不要忽略来自编译器的警告。@svick谢谢。编译器说该方法缺少等待运算符,将同步运行。现在,想想我提到的方法3。当method3调用method1时,在这两种情况下,在到达等待调用后,控制返回method3。那么,区别是什么呢?区别在于从
Method1
返回的
Task
何时完成。使用#2,它将立即完成(不等待在
Task.Run()
中启动的
Task
完成)。