C# 以下哪项功能更有效?

C# 以下哪项功能更有效?,c#,winforms,worker-thread,C#,Winforms,Worker Thread,使用线程时,使用“invoke”来避免“Cross-thread”(1) 但是,有时使用“计时器对象”来避免“交叉线程”(2) 像这样(例如) 哪一个更有效?”在(1)和(2)之间“ 如果我们在“计时器事件”中检查数据后将其分散在“线程”中处理,而不使用“调用”或其他方法,这会是一个问题吗?(我们听说,为了避免在“线程”中打印处理的数据时出现“交叉线程”,经常使用附加的“计时器对象”分散“计时器事件”中的数据,因为这既没有好处也没有坏处)。只需使用一个实例并处理ReportProgress和/

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

但是,有时使用“计时器对象”来避免“交叉线程”(2)

像这样(例如)

哪一个更有效?”在(1)和(2)之间“



如果我们在“计时器事件”中检查数据后将其分散在“线程”中处理,而不使用“调用”或其他方法,这会是一个问题吗?(我们听说,为了避免在“线程”中打印处理的数据时出现“交叉线程”,经常使用附加的“计时器对象”分散“计时器事件”中的数据,因为这既没有好处也没有坏处)。

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

正如Ben Voigt建议的那样,
BackgroundWorker
可能是您应该在这里使用的,除非您有很好的理由想使用其他东西

“有效”是一种相当模糊的比较手段。在你考虑的两个选择中,你想要什么并不完全清楚

BackgroundWorker
s简单易懂,并且避免使用计时器

Invoke
比计时器更有效,因为bCheckState变为true和文本更新之间的延迟更小。它的CPU密集度也会降低,因为在设定的时间间隔内不会有计时器轮询

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

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


它们都有各自的优点和缺点,一般来说,你不能称任何一种更有效。

不知道你的意思。你根本没有在代码中使用invoke,你需要它
timer\u Tick
Work()
你说的“有效”是什么意思?还要看看使用SynchronizationContext而不是调用invoke这里的代码片段是没有意义的,启动线程只是将bool字段设置为true没有意义。马上把它设为真。也许你应该读一些书来获得一些见解,线程很难在这么一篇文章中解释上述“代码片段”仅用于解释案例(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;
        }
    }
}