2014-10-19 201 views
2

我尝试了一些异步/等待的事情,但我不会真的得到它。我最初想要完成的事情是从两个不同的线程同时写入控制台。下面是代码:如何正确使用异步等待

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()?

+5

请勿使用'async void'。 – SLaks 2014-10-19 14:24:31

+0

看看我的[async-await curation](https://curah.microsoft.com/45553/asyncawait-general)。 – 2014-10-25 09:26:46

回答

8

并行和并发不是一回事。如果你想在并行使用Task.Run执行你的for循环到工作卸载到一个不同的线程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

这显示了所需的行为,谢谢。 – egon12 2014-10-19 16:01:10

+1

详细解释异步/等待问题:理解这些关键字的作用和不做的作用是很重要的。特别是,它们并不会实际上导致异步运行。他们所做的是告诉编译器,async方法需要调用某种异步完成的操作,方法需要等待该操作的完成,然后继续执行其他操作。如果没有什么东西在异步方法中“等待”,它就像普通方法一样直接完成。 – 2014-10-20 00:41:07

0

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

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