Thread,ThreadPool和amp;之间的区别的BackgroundWorker

时间:2014-03-11 19:13:42

标签: c# multithreading backgroundworker threadpool

我很多时候在线程的帮助下调用方法

static void Main( string[] args )
{
    Thread t = new Thread( MyFunction );
    t.Start();
}

static void MyFunction()
{
    //code goes here
}

有些时候我使用ThreadPool类也喜欢

System.Threading.ThreadPool.QueueUserWorkItem(delegate {
    MyFunction();
}, null);

但我不明白在线程类或ThreadPool

的帮助下调用任何方法有什么区别

所以我正在寻找一个很好的讨论,关于Thread和amp;之间的区别是什么? ThreadPool class.also需要知道何时应该使用Thread类来调用方法,何时ThreadPool类调用任何方法?如果可能的话,还要讨论带有样本情况的示例代码。

另一个非常重要的问题是,如果我启动多个线程,那么我的应用程序性能会变低还是差?如果是,那么告诉我为什么......?

现在还告诉我什么是BackgroundWorker类以及它与Thread& ThreadPool课程。我听说BackgroundWorker类还创建了一个单独的线程来运行任何方法。所以请讨论它与Thread& ThreadPool课程,何时应该选择BackgroundWorker课程。

这是BackgroundWorker

的小样本代码
private void button1_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        // this allows our worker to report progress during work
        bw.WorkerReportsProgress = true;

        // what to do in the background thread
        bw.DoWork += new DoWorkEventHandler(
        delegate(object o, DoWorkEventArgs args)
        {
            BackgroundWorker b = o as BackgroundWorker;

            // do some simple processing for 10 seconds
            for (int i = 1; i <= 10; i++)
            {
                // report the progress in percent
                b.ReportProgress(i * 10);
                Thread.Sleep(1000);
            }

        });

        // what to do when progress changed (update the progress bar for example)
        bw.ProgressChanged += new ProgressChangedEventHandler(
        delegate(object o, ProgressChangedEventArgs args)
        {
            label1.Text = string.Format("{0}% Completed", args.ProgressPercentage);
        });

        // what to do when worker completes its task (notify the user)
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        delegate(object o, RunWorkerCompletedEventArgs args)
        {
            label1.Text = "Finished!";
        });

        bw.RunWorkerAsync();
    }

1 个答案:

答案 0 :(得分:21)

  

但我不明白在线程类或ThreadPool类的帮助下调用任何方法有什么区别

主要区别在于您是自己管理线程生存期(Thread),还是利用框架已经创建的线程“池”。

使用ThreadPool.QueueUserWorkItem将(经常)使用系统中已存在的线程。这意味着你没有开始新线程的开销 - 相反,已经存在一组线程,而你的工作就是在其中一个线程上运行。如果你做了很多短暂的操作,这可能会特别有用。

当你使用new Thread时,你实际上会启动一个新的线程,直到你的委托完成它的执行。

请注意,从.NET 4和4.5开始,我建议使用TaskTask<T>类型,而不是使用自己的线程,或使用ThreadPool.QueueUserWorkItem。这些(默认情况下)使用线程池来执行,但提供许多其他有用的抽象,特别是使用C#5和await / async关键字。

  

现在还告诉我什么是BackgroundWorker类以及它与Thread&amp; ThreadPool类。 ħ

BackgroundWorker类是线程池的抽象。它使用ThreadPool排队“工作”(您的DoWork事件处理程序),还提供额外的功能,允许将进度和完成事件发回到初始SynchronizationContext(在GUI程序中,通常是用户界面线程)。这样可以简化您希望在后台线程上运行后台“工作”时更新进度或完成通知的UI的任务。