这些功能中哪一个更有效
本文关键字:有效 哪一个 功能 | 更新日期: 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
,这也将停止线程的执行,直到调用完成。
它们都有各自的优点和缺点,你不能真的称任何一个更"有效"。