注意:如果您点击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!
}
答案 0 :(得分:0)
我认为取消按钮甚至没有被处理,因为由于await / async的使用不当,消息循环卡在启动按钮的处理程序中。我相信改变
send.Invoke(source.token)
到
send.BeginInvoke(source.token, null)
应该会给你想要的结果。
请注意,我实际上并没有编译您的代码。