2012-09-18 45 views
6

我 “Googled” 了,但还是有疑惑的任务,线程和后台工作.....C#/ VB.Net任务VS主题VS BackgroundWorker的

  1. 是“任务是一个高层次的API,在当前线程上运行“正确?

  2. 如果1是正确的,为什么我需要使用invoke在同一个线程中更改任务内的UI?

  3. Backgroundworker在应用程序中只获得最低优先级?那么backgroundworker的性能比任务和线程低吗?对 ?

  4. 最后,在我的应用程序中,我需要使用“HttpWebRequest”从服务器获取字符串,然后解析字符串并更新UI。 如果我使用“HttpWebRequest.BeginGetResponse”来等待异步结果并触发一个完整的事件来更新UI,我需要使用invoke方法来调用UI线程控制,但是我可以使用后台工作器而不是?我只需简单地在“RunWorkerCompleted”事件中更改UI,是否有任何缺点?

对不起,我的泳池英语和感谢您的帮助...!

+0

任务在幕后使用threadPool,它们不限于调用它们的当前线程 –

回答

4

1)不,任务默认情况下在线程池线程上运行。不过,您可以提供另一个可以以不同方式运行任务的调度程序。

3)默认情况下,优先级没有差别。 BackgroundWorker也在线程池线程上运行。

4)使用TaskFactory.FromAsync是一个相当简单的方法来处理异步Web请求:

Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null) 
    .ContinueWith(
     t => 
     { 
      using (var response = (HttpWebResponse)t.Result) 
      { 
       // Do your work 
      } 
     }, 
     TaskScheduler.FromCurrentSynchronizationContext() 
    ); 

使用TaskScheduler.FromCurrentSynchronizationContext确保了ContinueWith回调在当前线程调用。所以,如果任务是在UI线程上创建的,则响应将在后台检索,然后在UI线程上处理。