在 C# 中强制实施并行事件调用的顺序

本文关键字:并行 事件 调用 顺序 施并行 | 更新日期: 2023-09-27 18:35:51

我有一个C#程序,它有两个元素,一个TreeView和一个DataGridView以及两个EventHandelrs。 在树视图中选择项时,DataGridView 将包含一个显示一些信息并可由用户编辑的表。 树视图中的每个项都有其自己唯一的表。 当用户取消对 DataGridView 的关注时,将更新软件基础软件模型(保存用户所做的更改):

aDataGridView_Leave(object sender, EventArgs e)
{
     //Update the software model (save the current DataGridView)
}
aTreeView_AfterSelect(object sender, EventArgs e)
{
    //Update the table that is shown in aDataGridView
}

我的问题是,如果用户通过在 TreeView 中选择不同的项目来取消对 DataGridView 的关注,我基本上会在这些事件中的哪一个首先发生之间产生争用条件(即使这一切都在一个线程上)。 显然,在这种情况下,我希望首先触发DataGridView_Leave事件,或者在保存更改之前加载新表会破坏用户对表所做的更改。

有没有优雅的方法来强制执行什么事件首先发生?

在 C# 中强制实施并行事件调用的顺序

听起来您可以通过保留一个isDirty布尔值来解决此问题,当必须保存更改时,该布尔值是正确的。您需要自己跟踪这一点,例如在属性设置器中。选中isDirty aTreeView_AfterSelect并在必要时保存,并在aDataGridView_Leave中选中,以便在没有更改时不保存。

这应该有效,但听起来您的设置有点笨拙,并且当元素失去焦点时保存更改对于用户来说可能是违反直觉的。

立即想到的是某种计数器。为每个事件呼叫分配一个号码,并存储最后一个处理的号码。这样,您可以检查它是否是旧事件并忽略它。我还没有看到它在 C# 中完全使用,但是很多时候在 AJAX 中,网络延迟经常导致这种情况。

我创建了一个简单的窗口窗体应用程序,其中包含树视图、网格视图和文本框来记录发生的事件。 当您离开网格视图时,其离开事件始终在选择后的树视图之前触发。

是否将数据异步保存在网格视图中? 我可以看到您是否正在异步保存,那么在您的异步方法抓取要从网格保存的数据之前,选择后的树视图可能会触发。

如果是这种情况,请将网格视图数据推送到堆栈,并在执行保存的方法中将其弹出。