【问题标题】:C# / VB.Net Task vs Thread vs BackgroundWorkerC#/VB.Net 任务 vs 线程 vs BackgroundWorker
【发布时间】:2012-09-18 18:55:24
【问题描述】:

我已经“谷歌”了,但仍然对任务、线程和后台工作人员感到困惑.....

  1. “任务是在当前线程上运行的高级 API”正确吗?

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

  3. Backgroundworker 只在应用程序中获得最低优先级?所以 backgroundworker 的性能低于 task 和 thread ?对吧?

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

对不起,我的台球英语,谢谢你的帮助......!

【问题讨论】:

  • 任务在后台使用线程池,它们不限于调用它们的当前线程

标签: c# vb.net multithreading backgroundworker task


【解决方案1】:

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

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

4) 使用TaskFactory.FromAsync 是一种处理异步网络请求的相当简单的方法:

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 线程上进行处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2011-10-13
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多