无法阻止后台工作人员

时间:2012-04-05 00:20:21

标签: background worker

我正在编写一个机器人,正在另一个胎面/后台工作人员,我正试图阻止它,但在按下取消后,机器人仍在工作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;
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您是否意识到需要在DoWork()方法中检查取消(例如,通过检查CancellationPending)? CancelAsync()不会“神奇地阻止工人”,它只是“表示”你要取消工人;工人需要中止它正在做的事情,清理它的东西等然后返回。 This example可能会为您清除它。

另外,来自CancelAsync documentation

  

CancelAsync方法提交请求以停止后台   operation和将CancellationPending属性设置为true

     

当您调用CancelAsync时,您的后台操作将能够执行   停下来。 操作代码应定期检查   CancellationPending属性以查看它是否已设置为true。