代码之家  ›  专栏  ›  技术社区  ›  BVernon

如何在再次调用事件时中止之前的执行?

  •  0
  • BVernon  · 技术社区  · 4 年前

    我知道这可能是一个我应该能够很容易地谷歌,但只是不确定什么是搜索目前。。。

    基本上,我有一个引发的事件,当它仍在执行时,它可能会再次引发。如果发生这种情况,我想立即终止之前的任何执行。

    在本例中,我讨论的是DataGridView的SelectionChanged事件。在我将异步编程引入这个项目之前,没有任何问题。但现在我发现,当该方法等待异步调用的结果时,它可能会再次被引发。新调用可能会在原始调用之前完成,这会导致UI状态不一致。

    0 回复  |  直到 4 年前
        1
  •  3
  •   JonasH    4 年前

    这样怎么样:

        private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
        public async void OnMainThread()
        {
            cancellationTokenSource.Cancel();
            var newCts = new CancellationTokenSource();
            cancellationTokenSource = newCts;
            try
            {
                var result = await AsyncOp(newCts.Token);
                if (!newCts.IsCancellationRequested)
                {
                    // Update UI
                }
            }
            catch (OperationCanceledException)
            {
                // Ignore
            }
        }
    
        public async Task<int> AsyncOp(CancellationToken cancel)
        {
            // Do the async work
            return 0;
        }