如何在c#中取消操作

时间:2014-05-24 17:12:57

标签: c# .net multithreading

注意:如果您点击buttonStart,然后点击buttonCancelSending,则不会引发buttonCancelSending_Click的事件,该事件将发送取消信号... 无论如何我可以通过点击按钮取消来取消foreach发送?!

    private void buttonStart_Click(object sender, EventArgs e)
    {
           Action<CancellationToken> send = async (token) =>
                {
                    await Task.Run(() => Thread.Sleep(1500));
                    int sendCount = 10;
                    foreach (ListViewItem item in listViewReleases.Items)
                    {
                        if (token.IsCancellationRequested)
                            break;
                        if (this.Focused)
                            return;

                        if (sendCount > 0)
                        {
                            if (item.Checked == false)
                                continue;
                            SendKeys.SendWait("^a");
                            SendKeys.SendWait(Utilities.FixSenderTags(item.SubItems[1].Text));
                            SendKeys.SendWait("{TAB}");
                            if (token.IsCancellationRequested)
                                return;
                        }
                        else
                        {
                            // don't send more then 10 releases
                            break;
                        }
                        sendCount--;
                    }
                    SendReleaseTypes();
                };
            send.Invoke(source.Token);
    }

    private void buttonCancelSending_Click(object sender, EventArgs e)
    {
        source.Cancel(); // send the signal for cancellation!
    }

1 个答案:

答案 0 :(得分:0)

我认为取消按钮甚至没有被处理,因为由于await / async的使用不当,消息循环卡在启动按钮的处理程序中。我相信改变

send.Invoke(source.token) 

send.BeginInvoke(source.token, null)

应该会给你想要的结果。

请注意,我实际上并没有编译您的代码。