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