2011-01-25 89 views
1

使用的await我有这样的事情:非CPU密集型任务

private void DoSomething() 
{ 
    System.Console.WriteLine("Creating Foo"); 
    Foo result = new Foo(); 

    DoSomethingAsync(); 

    System.Console.WriteLine("Returning Foo"); 
    return result; 
} 


private async void DoSomethingAsync() 
{ 
    // The following task takes a long time, but is not CPU intensive 
    await TaskEx.Run(() => 
    { 
     // code lives here... removed for this example 
    }); 
} 

因为我没有太多打CPU,我并不需要一个线程。我可以使用什么而不是Run来避免创建线程?

+0

我可能是完全错误的,但是如果你想做一些异步的事情,你必须有一个单独的线程来完成异步工作。如果将它保留在同一个线程上,则它会阻塞,因此是同步的。 – 2011-01-25 23:44:45

+0

我对异步库的理解是,它使用windows消息泵创建回调并管理代码执行,以便在不实际使用线程的情况下提供线程外观(异步执行)。也就是说,除非您使用任务的“运行”方法,此时您将获得一个线程。运行仅建议用于CPU密集型操作。 Anders Hejlsberg给出的PDC 2010演讲很好地解释了这一点: http://bit.ly/bBGOfV – mbursill 2011-01-25 23:51:12

回答

1

我想你在这里误解了任务异步模式的意图。你在做什么可能会更好地处理ThreadPool.QueueUserWorkItem这将重用进程的池中的工作线程,只有在必要时创建一个。

TAP允许您将任务分解为可以逐步处理的“大块”工作,但它不直接提供表达“这是后台任务”的方法。

0

这取决于你正在做的任务。既然你说它没有使用大量的CPU,我会认为这个任务需要很长时间,因为它正在等待其他事件。因此,您需要设计任务来为这些事件注册回调,其中每个回调在主线程上快速完成,但直到您实际等待的事件发生时才会触发回调。

相关问题