下面的代码,我尝试学习任务类。从输出中,我看到主线程和任务线程同时运行。但我在异步方法中得到警告信息说:
"警告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);
}
}
}
}
答案 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);