C# 如何正确使用异步等待
我用async/await尝试了一些东西,但我真的不明白。一开始我想要实现的就是从两个不同的线程并发地写入控制台。代码如下:C# 如何正确使用异步等待,c#,.net,task-parallel-library,async-await,C#,.net,Task Parallel Library,Async Await,我用async/await尝试了一些东西,但我真的不明白。一开始我想要实现的就是从两个不同的线程并发地写入控制台。代码如下: static void Main(string[] args) { DoSomethingAsync(); for (int i = 0; i < 1000; i++) Console.Write("."); Console.ReadLine(); } static async void DoSomethingAsync
static void Main(string[] args)
{
DoSomethingAsync();
for (int i = 0; i < 1000; i++)
Console.Write(".");
Console.ReadLine();
}
static async void DoSomethingAsync()
{
Console.WriteLine("DoSomethingAsync enter");
//This does not seem good
await Task.Delay(1);
for (int i = 0; i < 1000; i++)
Console.Write("X");
Console.WriteLine("DoSomethingAsync exit");
}
我看到的最基本的例子都是这样的。但是,当您想做一些非异步的耗时的事情时,该怎么办呢?您不能等待任何事情,因此所有代码都在主线程上运行。
如何在不使用Task.Delay()的情况下实现与此代码相同的行为?并行和并发不是一回事。如果希望并行执行
for
循环,请使用任务。运行将该工作卸载到不同的线程池
线程:
static void Main(string[] args)
{
var task = Task.Run(() => DoSomething());
for (int i = 0; i < 1000; i++)
Console.Write(".");
task.Wait()
}
static void DoSomething()
{
for (int i = 0; i < 1000; i++)
Console.Write("X");
}
static void Main(字符串[]args)
{
var task=task.Run(()=>DoSomething());
对于(int i=0;i<1000;i++)
控制台。写(“.”);
任务。等待()
}
静态空隙剂量测定法()
{
对于(int i=0;i<1000;i++)
控制台。写入(“X”);
}
async await
用于异步操作,异步操作可以同时运行,但不一定要运行 您可以使用async Task
方法并对结果任务调用Wait
。这会奏效的。但是,它将引入并发性,因为线程池上提供计时器计时。我不确定控制台的线程安全性保证了什么
这样一个东西的行为非常像一个UI线程。您所有的代码都是单线程运行的,但是您可以执行多个异步方法。不要使用async void
。请查看我的。要详细说明异步/等待问题,了解这些关键字做什么和不做什么很重要。特别是,它们实际上不会导致任何东西异步运行。他们所做的是告诉编译器,异步方法应该调用某种将异步完成的操作,方法希望等待该操作完成,然后继续执行其他操作。在异步方法中没有“等待”的东西,它只是像普通方法一样直接完成。
static void Main(string[] args)
{
var task = Task.Run(() => DoSomething());
for (int i = 0; i < 1000; i++)
Console.Write(".");
task.Wait()
}
static void DoSomething()
{
for (int i = 0; i < 1000; i++)
Console.Write("X");
}