【发布时间】:2017-07-24 04:12:07
【问题描述】:
下面我尝试学习Task类的代码。从输出中,我看到主线程和任务线程同时运行。但我在异步方法中收到警告消息:
"警告 1 此异步方法缺少 'await' 运算符,将同步运行。考虑使用 'await' 运算符等待非阻塞 API 调用,或使用 'await 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);
}
}
}
}
【问题讨论】:
-
我怀疑你误解了
async。这并不意味着“使这个同步方法异步”。这意味着允许我在这个异步方法中使用异步等待。该方法必须是已经异步的。与await类似。它不会使其参数异步;它标识了异步工作流中的一个点,在该点工作必须在工作流继续之前完成。 -
是的,你是对的。我误解了这些概念。我想在创建 Task 对象并启动任务后,它会像后台工作线程一样独立运行另一个线程。
-
@Phil 请花点时间阅读A Tour of Task, Part 1: Constructors - Stephen Cleary。
-
此外,尝试了解控制台应用程序中的异步是一种非常令人困惑的开始方式。控制台不像 GUI 应用程序那样自然是异步的。尝试在 WPF 或 Winforms 应用中学习。
标签: c# multithreading asynchronous