Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何延迟在C#中的UI线程上运行代码?_C#_Multithreading_Async Await_Wait - Fatal编程技术网

如何延迟在C#中的UI线程上运行代码?

如何延迟在C#中的UI线程上运行代码?,c#,multithreading,async-await,wait,C#,Multithreading,Async Await,Wait,所以我有一个BackgroundWorker做一些事情,当它完成时,RunWorkerCompleted必须更新ObjectListView 问题是,用户可能正在ObjectListView中编辑单元格。在单元格编辑期间尝试更新它会导致彻底的破坏,因此我不想让RunWorkerCompleted做它该做的事情,除非用户没有编辑(即ObjectListView.IsCellEditing为false) 最好的方法是什么 我的意思是,我可以设置一个计时器来检查iscelletiting是否为fals

所以我有一个BackgroundWorker做一些事情,当它完成时,
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。它似乎工作得相当整洁,只需要很少的额外代码。