【发布时间】:2020-05-22 06:20:55
【问题描述】:
我知道这可能是我应该能够很容易地用谷歌搜索的一个,但现在不确定要搜索什么......
基本上,我有一个引发的事件,当它仍在执行时,它可能会再次引发。如果发生这种情况,我想立即终止之前的任何执行。
在这种特定情况下,我说的是 DataGridView 的 SelectionChanged 事件。在我向这个项目介绍异步编程之前,没有任何问题。但是现在我发现当该方法等待异步调用的结果时,它可能会再次被引发。并且新调用可能会在原始调用之前完成,从而导致 UI 状态不一致。
【问题讨论】:
-
可能会在 SelectionChanged 引发时将任务放入队列中?
-
异步操作是否接受
CancellationToken? -
请分享你的代码
-
当
SelectionChanged触发的程序正在执行时,用户是否不应该选择其他任何东西?如果不是,那么它并不意味着是异步的。这些选择变化是否意味着网格其他值的变化?还是其他控件?数据本身?如果是这样,它可能并不意味着是异步的。用户是否可以触发选择更改和/或相同元素的值更改或受/将受SelectionChange触发的异步过程影响的元素?如果是这样,则不是异步的。如果表单关闭怎么办?这会对 async proc 的操作产生影响吗? -
如果该过程由选择更改触发,则意味着更改其他地方(不影响当前用户输入),并且这些更改也意味着它们的顺序性质/结果集,然后使用顺序代理(队列)处理它们。可以中断这些程序而不会造成伤害吗?然后使用 CancellationTokenSource 发出信号让任务顺利退出,因为知道运行它们的 UI 线程中的元素可能无法再访问了。
标签: c# winforms events async-await