如何正确使用异步等待

时间:2014-10-19 14:23:01

标签: 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()
{
    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");
}

使用简单但具有异步/等待的线程我只能在完成这个奇怪的时候完成它

await Task.Delay(1);

我看到的大多数基本例子都使用了它。但是,当你想做一些不同步的时间时,该怎么做?你不能等待任何东西,因此所有代码都在主线程上运行。 如何在不使用Task.Delay()的情况下实现与此代码相同的行为?

2 个答案:

答案 0 :(得分:8)

并行和并发不是一回事。如果您希望并行执行for循环,请使用Task.Run将该工作卸载到另一个ThreadPool线程:

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

async-await用于异步操作,可能同时运行,但必然

答案 1 :(得分:0)

您可以使用async Task方法并在生成的任务上调用Wait。这会奏效。但是,它会引入并发性,因为在线程池上提供了计时器滴答。我不确定控制台的线程安全性是什么。

Consider setting up a single threaded synchronization context.这样的事情就像一个UI线程。您的所有代码都运行单线程,但您可以执行多个异步方法。