功能运行同步当VS说它应该运行异步

时间:2015-06-13 17:49:16

标签: c# .net async-await

为什么B运行同步? Vs说。“因为没有等待这个调用,所以当前方法的执行在呼叫完成之前继续。” ;

A) Task.Factory.StartNew(() => Funcation(1, 1)); //Runs Async

B) Funcation(1, 1); // Says it runs async in vs, but really runs sync.
C)  var handleOne = Task.Run(() =>
        {
            Funcation(1, 1);
        }); // Runs Async
D) await Task.Factory.StartNew(() => Funcation(1, 1)); //awaits correctly
E) await Funcation(1, 1); //awaits correctly


 static private async Task<int> Funcation(int x, int y)
 {
     Task.Delay(1000).Wait();
 }

2 个答案:

答案 0 :(得分:1)

Funcation正在使用async关键字,但await没有Function用于其中的任何内容,因此它始终会同步运行。 Task.Factory.StartNew(() => Funcation(1, 1)); //Runs Async 甚至都没有编译。

<强> A)

Function

在这里你创建一个线程,在那个线程上你调用Funcation(1, 1); 所以它是asynchrounsly因为它在另一个线程上运行。

<强> B)

Function

async被标记为await,但未被Function标记为调用它。在这种情况下,编译器不会检查await是否在其身体中使用var handleOne = Task.Run(() => { Funcation(1, 1); }); // Runs Async (它已在您的函数声明中告诉您)。它只是检查你是否在不等待它的情况下调用异步方法。

<强> C)

await Task.Factory.StartNew(() => Funcation(1, 1)); //awaits correctly

我不确定这个,如果有人知道这里发生了什么,请帮助。

<强> d)

await Funcation(1, 1); //awaits correctly

A 相同,但等待创建的任务,一切正常。创建一个运行异步操作的任务也是一个非常糟糕的主意。

<强> E)

async

我们真的除了别的事情发生了吗?这是您应该使用await和{{1}}的方式。

答案 1 :(得分:0)

您的功能正在使用Wait,即阻止。请改用await。此外,您将任务定义为Task<int>,但没有返回任何结果 - 这不会编译。它应该是这样的:

static private async Task<int> Funcation(int x, int y)
{
    await Task.Delay(1000);

    return x + y; // some int result
}

使用您的代码&#34; E&#34;调用。其他调用都是不正确的。

此外,如果您的代码确实不需要延迟,那么这对于异步来说不是一个好的用例。异步操作应该是长时间运行或IO绑定的事情。如果您的代码只是执行简单的算术,那么只需将它作为传统的同步方法。