这些功能中哪一个更有效

本文关键字:有效 哪一个 功能 | 更新日期: 2023-09-27 18:20:36

使用线程时,使用"invoke"来避免"Cross-thread"(1)

但是,有时"定时器对象"被用来避免"交叉线程"(2)

像这样(例如)

public partial class Form1 : Form
{
    private bool bCheckState = false;
    public Form1()
    {
        InitializeComponent();
    }
    //Button Click
    private void btnWork_Click(object sender, EventArgs e)
    {
        Thread m_Thread = new Thread(new ThreadStart(Work));
        m_Thread.Start();
    }
    private void Work()
    {
        bCheckState = true;            
        // not use invoke 
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        if (bCheckState)
        {
            //tbxDisplay is winform's textBox control - printing data
            tbxDisplay.Text = bCheckState.ToString();
            bCheckState = false;
        }
    }
}

哪一种更有效介于(1)和(2)之间


如果我们在"计时器事件"中检查完"线程"中处理的数据后,不使用"invoke"或其他方法,将其分散在"线程"内,这会是一个问题吗?(我们听说,在打印"线程"中处理的数据时,为了避免"跨线程",经常使用将数据分散在"计时器事件"中并添加额外的"计时器对象",因为这既没有好处也没有害处)。

这些功能中哪一个更有效

只需使用一个BackgroundWorker实例并处理已经在正确线程中的ReportProgress和/或RunWorkerCompleted事件。

正如Ben Voigt所建议的,BackgroundWorker可能是您应该在这里使用的,除非您有充分的理由想要使用其他东西。

"有效"是一种相当模糊的比较手段。目前还不完全清楚你在考虑的两个选项中寻找什么。

BackgroundWorker简单易懂,并且避免使用定时器。

Invoke比计时器更有效,因为在bCheckState变为真和文本被更新之间的延迟将更小。它也将减少CPU占用,因为你不会有一个定时器在设定的时间间隔轮询。

Timer更有效,因为线程在调用以更新文本时不必停止,但它有点低效,因为它会浪费CPU时间来检查布尔值是否已更改,并且在表单更改之前可能会有长达计时器间隔长度的延迟。

作为另一种选择,BeginInvoke可以用于更新表单,而无需使用计时器,也无需线程等待调用完成。但是,如果它引发异常,线程可能不会发现,除非您也调用EndInvoke,这也将停止线程的执行,直到调用完成。

它们都有各自的优点和缺点,你不能真的称任何一个更"有效"。