C# 当VS说它应该运行异步时,函数运行Sync

C# 当VS说它应该运行异步时,函数运行Sync,c#,.net,async-await,C#,.net,Async Await,B为什么运行同步?Vs说,“因为这个调用没有等待,所以在调用完成之前,当前方法的执行将继续。” A)Task.Factory.StartNew(()=>function(1,1))//异步运行 B) 函数(1,1);//说它在vs中运行异步,但实际上运行同步。 C) var handleOne=Task.Run(()=> { 函数(1,1); }); // 异步运行 D) wait Task.Factory.StartNew(()=>function(1,1))//正确等待 E) 等待函数(1,

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

A)Task.Factory.StartNew(()=>function(1,1))//异步运行
B) 函数(1,1);//说它在vs中运行异步,但实际上运行同步。
C) var handleOne=Task.Run(()=>
{
函数(1,1);
}); // 异步运行
D) wait Task.Factory.StartNew(()=>function(1,1))//正确等待
E) 等待函数(1,1)//正确等待
静态专用异步任务函数(int x,int y)
{
Task.Delay(1000.Wait();
}

函数正在使用
async
关键字,但不
等待其主体中的任何内容,因此它将始终同步运行。而且
函数
甚至不编译

A)

这里创建一个线程,并在该线程上调用
函数
,因此它是异步的,因为它正在另一个线程上运行

B)

函数
标记为
async
,但在调用该函数的位置未标记为
wait
ed。在这种情况下,编译器不会检查
函数
是否在其主体中使用
wait
(它已经在函数声明中告诉您了)。它只是检查您是否正在调用异步方法而不等待它

C)

我不是很确定,如果有人知道这里发生了什么,请帮忙

D)

A相同,但您等待创建的任务,一切正常。另外,创建一个任务来运行异步操作也是一个非常糟糕的想法

E)


我们是否真的不知道发生了什么事?这确实是您应该使用的
async
Wait
的方式。您的函数正在使用
Wait
,这是阻塞。改用
wait
。另外,您将任务定义为
任务
,但没有返回任何结果-这将无法编译。应该是这样的:

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

    return x + y; // some int result
}
静态私有异步任务函数(int x,int y)
{
等待任务。延迟(1000);
返回x+y;//一些int结果
}
使用代码“E”来调用。其他调用都不正确


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

B在运行代码时仍然让我感到困惑,因为它看起来是B,而不是异步运行的。它似乎运行同步,因为它阻止当前线程向前移动。在B被称为intill B之后,不会运行任何东西。B是异步还是同步?编译器在函数声明中告诉您,异步方法不等待任何东西,所以它将同步运行,当您像B一样调用它时,它将同步运行“当前方法的执行在调用完成之前继续”我认为这意味着调用是异步的,因为当前的方法将继续。所以我误解了vs告诉我的。我想我明白了。
Task.Factory.StartNew(() => Funcation(1, 1)); //Runs Async
Funcation(1, 1);
var handleOne = Task.Run(() => { Funcation(1, 1); }); // Runs Async
await Task.Factory.StartNew(() => Funcation(1, 1)); //awaits correctly
await Funcation(1, 1); //awaits correctly
static private async Task<int> Funcation(int x, int y)
{
    await Task.Delay(1000);

    return x + y; // some int result
}