C# 如何正确使用异步等待

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

我用async/await尝试了一些东西,但我真的不明白。一开始我想要实现的就是从两个不同的线程并发地写入控制台。代码如下:

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");
}