这段代码是同步还是异步?

时间:2017-03-03 22:05:17

标签: c# multithreading asynchronous

下面的代码,我尝试学习任务类。从输出中,我看到主线程和任务线程同时运行。但我在异步方法中得到警告信息说:

"警告1此异步方法缺少等待'运营商并将同步运行。考虑使用' await'运营商等待非阻塞API调用,或等待Task.Run(...)'在后台线程上进行CPU绑定工作。"

那么下面的代码是同步的吗?

namespace SampleThreadTaskClass
{
    class Program
    {
        static void Main(string[] args)
        {           
            Task task = new Task(ProcessDataAsync);
            task.Start();

            Console.WriteLine("Enter any key");

            string input = Console.ReadLine();
            Console.WriteLine("You entered: " + input);

            Console.ReadLine(); 
        }

        static async void ProcessDataAsync()
        {
            for (int i = 0; i < 20; i++)
            {
                Thread.Sleep(500);
                Console.WriteLine("processing... " + i);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

ProcessDataAsync方法确实是同步的。它声称是异步,它存在于该声明

然后将同步方法提供给Task的构造函数,该构造函数将在线程池线程中执行该同步方法(您不应该使用它)顺便说一句;如果你想在线程池线程中执行同步方法,你应该使用Task.Run)。

当然,对于您的情况,想要在线程池线程中执行此方法。你是异步操作只是在等待。没有必要安排一个新的线程池线程只是坐在那里一次不做

您应该ProcessDataAsync实际上是异步的,使用Task.Delay创建一个Task,它将在给定的时间间隔内完成,您可以await,然后当你想要启动异步方法时,你可以简单地调用ProcessDataAsync,它实际上是异步的

答案 1 :(得分:0)

您应该尝试在开始任务之前编写一些代码,然后以异步方法启动任务。然后在第一个异步方法中使用另一个异步方法,如ProcessDataAsync使用await运算符。通过这种方式,您可以了解异步行为。

这会有所帮助

static async Task ProcessDataAsync()
    {
        for (int i = 0; i < 20; i++)
        {
            await Task.Delay(500);
            Console.WriteLine("processing... " + i);
        }
    }

当您将退货类型更改为async时,您需要将来电更改为ProcessDataAsyc

 var task = Task.Run(ProcessDataAsync);

是的,你的代码是异步的。

答案 2 :(得分:-1)

是的。 Thread.Sleep()不是异步的。

参见说明:https://msdn.microsoft.com/en-us/library/hh156528.aspx#Example

尝试延迟,然后你可以在它前面添加一个等待,

await Task.Delay(10000);