在我们的应用程序中,我们使用Threads和Delegate来获得最佳性能。为了操作我们的操作,我们使用System.Timers.Timer
类。
当应用程序启动时,1小时后任务管理器显示句柄数量增加,cpu使用量也增加。
我们可以做些什么来处置Thread和委托的对象?
下面的代码可以帮助您检查此任务。
public partial class Form1 : Form
{
System.Timers.Timer MainTimer;
public Form1()
{
InitializeComponent();
MainTimer = new System.Timers.Timer();
MainTimer.Elapsed+=new System.Timers.ElapsedEventHandler(MainTimer_Elapsed);
}
Thread MainThread;
private void button1_Click(object sender, EventArgs e)
{
MainTimer.Interval = 10;
MainTimer.Start();
}
void MainTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
MainThread = new Thread(new ThreadStart(DoStart));
MainThread.Start();
}
void DoStart()
{
PrintInfo();
}
delegate void PrintInfo_Delegate();
void PrintInfo()
{
if (textBox1.InvokeRequired)
{
Invoke(new PrintInfo_Delegate(PrintInfo));
}
else
{
textBox1.Text += "Test\r\n";
}
}
}
答案 0 :(得分:2)
如果我误解了某些东西,请道歉,但看起来一旦点击按钮,你就会每10毫秒开始一个新线程(在MainTimer_Elapsed中)?在不了解更多有关上下文/版本的情况下,很难就替代方案(async / await,TPL等)提供具体的建议,但是现在看起来就像创建新线程(尤其是非后台线程)一样如此恍惚?
为了处理非UI工作,也许使用ThreadPool.QueueUserWorkItem而不是创建自己的?对于UI工作,可能使用BackgroundWorker?如果你正在耗费线程池,你也可以考虑设置最大线程数,但是如果你能够以.Net 4为目标,那么使用TPL并避免使用/创建/管理线程会更好/更简单。 X