使用await进行非CPU密集型任务

时间:2011-01-25 23:40:39

标签: c# asynchronous async-await

我有这样的事情:

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来避免创建线程?

2 个答案:

答案 0 :(得分:1)

我认为你在这里误解了任务异步模式的意图。您正在做的事情可能由ThreadPool.QueueUserWorkItem更好地处理,它将重用进程池中的工作线程,只在必要时创建一个。

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

答案 1 :(得分:0)

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