2016-12-15 53 views
3

我的程序有以下声明3个警告:这种异步方法缺乏“等待”运营商和运行同步

这种异步方法缺乏“等待”运营商和将同步运行。 考虑使用'await'操作符来等待非阻塞API调用 或'await Task.Run(...)'在后台线程上执行CPU绑定工作。

什么是警告试图告诉我?我该怎么办?

这是我的代码:它使用多线程运行吗?

static void Main(string[] args) 
{ 
    Task task1 = new Task(Work1); 
    Task task2 = new Task(Work2); 
    Task task3 = new Task(Work3); 

    task1.Start(); 
    task2.Start(); 
    task3.Start(); 

    Console.ReadKey(); 
} 

static async void Work1() 
{ 
    Console.WriteLine("10 started"); 
    Thread.Sleep(10000); 
    Console.WriteLine("10 completed"); 
} 

static async void Work2() 
{ 
    Console.WriteLine("3 started"); 
    Thread.Sleep(3000); 
    Console.WriteLine("3 completed"); 
} 

static async void Work3() 
{ 
    Console.WriteLine("5 started"); 
    Thread.Sleep(5000); 
    Console.WriteLine("5 completed"); 
} 
+2

“异步”并不意味着“多线程”。请参阅我的[inync to'async'](http://blog.stephencleary.com/2012/02/async-and-await.html)文章,了解'async'的作用。 –

+0

@StephenCleary谢谢,文章非常好,易于理解 – mjb

回答

3

关键字async本身并没有多大作用。将其从您的代码中删除,您的代码将完全相同。

async是做什么用的?

  • 它改变有什么方法内有效,特别是它可以让你使用await关键字
  • 反过来,它意味着该方法的身体就会转化的基础上,await S中的存在在方法的主体中。
  • 如果该方法返回一个值,该方法也将转换为将返回值包装在Task中。

但是,如果你一)不要有任何await在你的方法主体和b)void返回,然后没有什么特别将得以实现。编译器的警告确实试图清楚这一点 - 没有任何await的方法只是简单的没有意义。 await s是此功能中更重要的部分。

0

你指定你的方法(工作1,WORK2,Work3)与关键字async但没有你的代码的这些方法中使用await运算符调用异步调用。

+0

此代码将异步运行,但不会等待结果。 – MistyK

0

是的,你的代码可能会使用多线程。但是,如果您刚刚删除了async关键字,它仍会这样做。由于你没有解释为什么它在那里,我建议删除它。

如果你想要一个异步/ AWAIT模式,您可以使用Task.Delay(),但我建议你阅读更多关于异步使用前/等待:

static async void Work3() 
{ 
    Console.WriteLine("5 started"); 
    await Task.Delay(5000); 
    Console.WriteLine("5 completed"); 
} 
0

您已经使用“async”与方法关键字指示Work1(),Work2()和Work3()方法是异步执行的,但是你没有使用'await'关键字。所以它同步执行。如果你想异步执行,使用'await'关键字。

static async void Work1() 
{ 
    Console.WriteLine("10 started"); 
    await Task.Delay(10000); 
    Console.WriteLine("10 completed"); 
} 

static async void Work2() 
{ 
    Console.WriteLine("3 started"); 
    await Task.Delay(3000); 
    Console.WriteLine("3 completed"); 
} 

static async void Work3() 
{ 
    Console.WriteLine("5 started"); 
    await Task.Delay(5000); 
    Console.WriteLine("5 completed"); 
} 
+0

此代码将异步运行,但不等待结果。 – MistyK