0

在我们的应用程序中,我们使用线程和委托来获得最佳性能。为了控制我们的操作,我们使用System.Timers.Timer类。当应用程序启动时,1 小时后任务管理器显示句柄数增加,cpu 使用率也增加。

我们可以做些什么来处理 Thread 和 delegate 的对象?

下面的代码可以帮助您检查此任务。

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";
        }
    }
}
4

1 回答 1

2

抱歉,如果我解析错误,但看起来一旦单击按钮,您就会每 10 毫秒启动一个新线程(在 MainTimer_Elapsed 中)?在不了解上下文/版本的情况下,很难就替代方案(async/await、TPL 等)给出具体建议,但似乎任何创建新线程(尤其是非后台线程)的事情都在这样做这么不自在?

对于处理非 UI 工作,也许使用 ThreadPool.QueueUserWorkItem 而不是自己创建?对于 UI 工作,也许使用 BackgroundWorker?如果您正在耗尽线程池,您还可以考虑设置最大线程数之类的东西,但是如果您能够定位.Net 4,那么使用 TPL 并避免线程的使用/创建/管理会更好/更简单恕我直言。 X

于 2013-05-31T05:05:18.520 回答