我正在编写一个机器人,正在另一个胎面/后台工作人员,我正试图阻止它,但在按下取消后,机器人仍在工作o.O
代码在这里: //停止我的机器人
private void botOff_Click(object sender, EventArgs e)
{
bot_worker.WorkerSupportsCancellation = true;
if (bot_worker.IsBusy)
bot_worker.CancelAsync();
botOn.Text = "Enable";
botOn.Enabled = true;
botOff.Enabled = false;
}
}
}
//启动我的机器人
private void botOn_Click(object sender, EventArgs e)
{
if (toolStripLabel5.Text == "Not attached")
{
MessageBox.Show(notAttached, "Skype Pwnage - Info!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
botOn.Text = "Running";
botOn.Enabled = false;
botOff.Enabled = true;
bot_worker.RunWorkerAsync();
}
}
编辑,跟着评论者链接并得到下面的代码它什么都不做,它仍然继续运行
private void bot_worker_DoWork(object sender, DoWorkEventArgs e)
{
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; (i <= 1); i++)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
skype.Attach(7, false);
skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus);
}
}
}
}
private void skype_MessageStatus(ChatMessage msg, TChatMessageStatus status)
{
try
{
string command = msg.Body.Remove(0, trigger.Length).ToLower();
string[] lines = richTextBox4.Text.Split('\n');
foreach (string ln in lines)
{
string[] commands = ln.Split(':');
if (command == commands[0])
{
listBox2.Items.Add(commands[0]);
skype.SendMessage(msg.Sender.Handle, string.Format(commands[1]));
break;
}
}
}
答案 0 :(得分:1)
您是否意识到需要在DoWork()方法中检查取消(例如,通过检查CancellationPending
)? CancelAsync()不会“神奇地阻止工人”,它只是“表示”你要取消工人;工人需要中止它正在做的事情,清理它的东西等然后返回。 This example可能会为您清除它。
另外,来自CancelAsync documentation:
CancelAsync方法提交请求以停止后台 operation和将CancellationPending属性设置为true 。
当您调用CancelAsync时,您的后台操作将能够执行 停下来。 操作代码应定期检查 CancellationPending属性以查看它是否已设置为true。