1

以下のこのコードの何が問題になっていますか? conn_PageDeleted はバックグラウンド スレッドから来ており、コールバックを受けるたびにラベルを更新しようとしています。エラーが表示されます

パラメータ数が一致しません。

コードは次のとおりです。

    private void cmdDeletePage_Click(object sender, EventArgs e)
    {
         worker = new BackgroundWorker();
         worker.DoWork += new DoWorkEventHandler(worker_DoWork);
         worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
         worker.RunWorkerAsync();
    }

    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        lblDeleteStatus.Text = "";
        MessageBox.Show("Complete");
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        Connecter conn = new Connecter("a", "m");
        conn.PageDeleted += new Connecter.PageDeletedHandler(conn_PageDeleted);
        bool success = conn.DeletePage(txtPageToDelete.Text, chkRecursive.Checked);
    }


    public delegate  void UpdateLabelHandler(object sender, string name);

    void conn_PageDeleted(object sender, string name)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new UpdateLabelHandler(UpdateMe));
        }
        else
        {
            lblDeleteStatus.Text = name;                
        }
    }

    private void UpdateMe(object sender_, string name_)
    {
        lblDeleteStatus.Text = name_;
    }
4

2 に答える 2

2

パラメータを UpdateMe メソッドに渡す必要があります。これを試してください。

void conn_PageDeleted(object sender, string name)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new UpdateLabelHandler(UpdateMe), new object[] {sender, name}); //<-- the update goes here
        }
        else
        {
            lblDeleteStatus.Text = name;                
        }
    }
于 2010-02-20T08:07:23.677 に答える
1

デリゲートは、次のようなイベント ハンドラーの署名と一致する必要があります。

パブリック デリゲート void UpdateLabelHandler(オブジェクト送信者、文字列 strArgs);

編集:これを含めるようにコードを編集したので...それに応じてこれを修正します....編集したコードを見て、私はこれに質問する必要があります:

    void worker_DoWork(オブジェクト送信者, DoWorkEventArgs e)
    {
        コネクタ conn = 新しいコネクタ("a", "m");
        conn.PageDeleted += 新しい Connecter.PageDeletedHandler(conn_PageDeleted);
        bool success = conn.DeletePage(txtPageToDelete.Text, chkRecursive.Checked);
    }

「PageDeleted」イベント ハンドラーを接続しています....その後、「DeletePage」メソッドを呼び出します。「DoWork」本体内でイベント ハンドラー「conn_PageDeleted」を呼び出し、「 BackgroundWorker' スレッドは終了しました...そして、'conn' は 'worker_DoWork' メソッドのローカル スコープにあるため、破棄され、イベント ハンドラーがめちゃくちゃになります! これを確認できますか?

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-02-20T03:31:52.030 に答える