如何延迟在C#中的UI线程上运行代码?
所以我有一个BackgroundWorker做一些事情,当它完成时,如何延迟在C#中的UI线程上运行代码?,c#,multithreading,async-await,wait,C#,Multithreading,Async Await,Wait,所以我有一个BackgroundWorker做一些事情,当它完成时,RunWorkerCompleted必须更新ObjectListView 问题是,用户可能正在ObjectListView中编辑单元格。在单元格编辑期间尝试更新它会导致彻底的破坏,因此我不想让RunWorkerCompleted做它该做的事情,除非用户没有编辑(即ObjectListView.IsCellEditing为false) 最好的方法是什么 我的意思是,我可以设置一个计时器来检查iscelletiting是否为fals
RunWorkerCompleted
必须更新ObjectListView
问题是,用户可能正在ObjectListView中编辑单元格。在单元格编辑期间尝试更新它会导致彻底的破坏,因此我不想让RunWorkerCompleted
做它该做的事情,除非用户没有编辑(即ObjectListView.IsCellEditing
为false)
最好的方法是什么
我的意思是,我可以设置一个计时器来检查
iscelletiting
是否为false,但这似乎有点像锤子敲开螺母,感觉有点脏。您可以使用oncelletitifinishing
事件来了解编辑何时完成
因此,如果
IsCellEditing
为true
,则将计算结果存储在某个地方,并存储在OnCellEditFinishing
处理程序中,检查需要更新的数据并进行更新。将其添加到您的代码中,以便后台进程可以安全暂停。您可以添加任意数量的点
bw.WaitOne(Timeout.Infinite);
当你想让它在主线程的这些点触发暂停时。。。比如当他们开始编辑单元格时。。。使用:
bw.Reset();
及恢复:
bw.Set();
ObjectListView是否提供任何相关事件?没有“用户不交互”的全局概念。(也可以考虑,当用户完成编辑时,更新的值可能是陈旧的)。最好是在稍后的时间丢弃用户的输入,而不是立即?@ USER 2664 740,它有一个<代码> CELDIT完成/<代码>事件。我明白你的意思了,我可以在某个地方设置一个bool,告诉
CellEditFinished
,检查OLV是否需要更新,然后从那里开始更新。@ThomasWeller,等等,什么?为什么我要放弃用户的输入?@JezClark,因为当RunWorkerCompleted
将更新ObjectListView时,你会这样做,不是吗?这就是我最后所做的,我(正如我在自己的评论中进一步建议的那样)让CellEditFinished
检查一个标志,看看是否需要更新OLV。它似乎工作得相当整洁,只需要很少的额外代码。