0

別のトレッド/バックグラウンド ワーカー上にあるボットをコーディングしていて、それを停止しようとしていますが、キャンセルを押した後、ボットはまだ動作しています oO

コードはこちら: //Stop my bot

        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;
            }
        }
    }
4

1 に答える 1

1

CancellationPendingDoWork() メソッドでキャンセルを確認する必要があることを認識していますか? CancelAsync() は「ワーカーを魔法のように停止する」のではなく、単にワーカーをキャンセルしたいという「シグナルを送る」だけです。ワーカーは、何をしていても中止し、その内容をクリーンアップしてから戻る必要があります。この例は、あなたのためにそれをクリアするかもしれません.

また、CancelAsync のドキュメントから:

CancelAsync メソッドは、バックグラウンド操作を停止する要求を送信し、CancellationPending プロパティを true に設定します

CancelAsync を呼び出すと、バックグラウンド操作を停止して終了できます。操作コードは、CancellationPending プロパティを定期的にチェックして、true に設定されているかどうかを確認する必要があります。

于 2012-04-05T00:24:19.287 に答える