c#application,任务管理器中的句柄增加和系统挂起

时间:2013-05-31 04:11:52

标签: c#

在我们的应用程序中,我们使用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";
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如果我误解了某些东西,请道歉,但看起来一旦点击按钮,你就会每10毫秒开始一个新线程(在MainTimer_Elapsed中)?在不了解更多有关上下文/版本的情况下,很难就替代方案(async / await,TPL等)提供具体的建议,但是现在看起来就像创建新线程(尤其是非后台线程)一样如此恍惚?

为了处理非UI工作,也许使用ThreadPool.QueueUserWorkItem而不是创建自己的?对于UI工作,可能使用BackgroundWorker?如果你正在耗费线程池,你也可以考虑设置最大线程数,但是如果你能够以.Net 4为目标,那么使用TPL并避免使用/创建/管理线程会更好/更简单。 X