我很多时候在线程的帮助下调用方法
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();
}
答案 0 :(得分:21)
但我不明白在线程类或ThreadPool类的帮助下调用任何方法有什么区别
主要区别在于您是自己管理线程生存期(Thread
),还是利用框架已经创建的线程“池”。
使用ThreadPool.QueueUserWorkItem
将(经常)使用系统中已存在的线程。这意味着你没有开始新线程的开销 - 相反,已经存在一组线程,而你的工作就是在其中一个线程上运行。如果你做了很多短暂的操作,这可能会特别有用。
当你使用new Thread
时,你实际上会启动一个新的线程,直到你的委托完成它的执行。
请注意,从.NET 4和4.5开始,我建议使用Task
和Task<T>
类型,而不是使用自己的线程,或使用ThreadPool.QueueUserWorkItem
。这些(默认情况下)使用线程池来执行,但提供许多其他有用的抽象,特别是使用C#5和await
/ async
关键字。
现在还告诉我什么是BackgroundWorker类以及它与Thread&amp; ThreadPool类。 ħ
BackgroundWorker
类是线程池的抽象。它使用ThreadPool
排队“工作”(您的DoWork
事件处理程序),还提供额外的功能,允许将进度和完成事件发回到初始SynchronizationContext
(在GUI程序中,通常是用户界面线程)。这样可以简化您希望在后台线程上运行后台“工作”时更新进度或完成通知的UI的任务。