2012-01-19 29 views
2

スレッドを使用してマシン上で何らかのプロセスを実行しています。最終的に、進行状況は他のスレッドに戻って報告されます。複数のパラメータでコントロールを呼び出すときのパラメータ数の不一致

public delegate void UpdateProgressDelegate(string description, int scriptnumber); 
public void UpdateProgress(string description, int scriptnumber) { 
    if (treeView.InvokeRequired) { 
     treeView.Invoke(new UpdateProgressDelegate(UpdateProgress), description, scriptnumber); 
     return; 
    } 
    // Update the treeview 
} 

そして、私が使用して、このデリゲートを呼び出すために:プロセスのステータスとGUIを更新するには、私はこのようなデリゲートを使用呼び出しが呼び出され

form.UpdateProgress("Ready", 3); 

を、私はTargetParameterCountExceptionを取得します:パラメータ数の不一致。

public delegate void UpdateProgressDelegate(object[] updateinfo); 
public void UpdateProgress(object[] updateinfo) { 
    string description = (string) updateinfo[0]; 
    int scriptnumber = (int) updateinfo[1]; 
    if (treeView.InvokeRequired) { 
     treeView.Invoke(new UpdateProgressDelegate(UpdateProgress), new object[] { description, scriptnumber }); 
     return; 
    }  
    // Update the treeview 
} 

を私は使用し、それを呼び出すために:

form.UpdateProgress(new object[] {"Ready", 3}); 

をしかし、これはどちらか動作しません は、私はこのように、単一のオブジェクト内の文字列とint型のパラメータを置くことによってこの問題を解決できると思っていました。私は同じTargetParameterCountExceptionを取得し続けます。どのように私はこれを修正することができる任意のアイデア?前もって感謝します!

+1

AddScriptメソッドはどのように宣言されていますか?または、上記のコードでUpdateProgressとAddScriptを混同しましたか? –

+0

スクリプト番号タイプは何ですか? – Tigran

+0

@ThomasLevesqueおっと、私はそれらを混同しましたが、AddScriptはまったく別の機能です!私は私のポストを更新します、問題と例外はまだ同じです。 – Carlito

答えて

2

私が言う:

treeView.Invoke((MethodInvoker)delegate { 
    UpdateProgress(description, scriptnumber); 
}); 

か(均等):

treeView.Invoke((MethodInvoker)() => UpdateProgress(description, scriptnumber)); 

これはあなたの静的なチェックを与え、それを簡単に行いますコンパイラでIIRC MethodInvokerが明示的にチェックされ、ではなくInvoke()で呼び出されますも速くなっています。


なぜそれが機能しないのですか。あなたの例では:

public delegate void UpdateProgressDelegate(object[] updateinfo); 

実際には2つのパラメータを渡しています。ここparamsに単一のアレイを明確し、合格するために、あなたはダブルラップすることが必要になります。

treeView.Invoke(new UpdateProgressDelegate(UpdateProgress), 
    new object[] { new object[] {description, scriptnumber }}); 

基本的には、外側の配列は、単一の要素が含まれ、「すべてのパラメータの配列」であり、最初のパラメータ(updateinfo)として渡すことはできません。

+0

ああ、その理由!しかし、パフォーマンスを除いて、Thomasが与えたソリューション(デリゲート関数を使用)ではなく、ソリューションを使用する利点がありますか?または、同じことを達成するための2つの方法がありますか? – Carlito

+0

@Carlito「ダブルラップと比較して」(つまり、私の答えの一番下にあるビット)を意味していれば、より具体的なデリゲートアプローチと同じように動作します。あなたが「匿名メソッドと比較して」(すなわち、私の答えの一番上にあるビット)を意味するなら、コンパイラでの静的型チェック!無効なパラメータなどを使用することはできません。また、紛らわしい余分なデリゲート型が不要になります。 –

+0

申し訳ありません、私を助けてくれてありがとう。私はあなたの答えを受け入れた! – Carlito

2

これは動作するはずです:

public delegate void UpdateProgressDelegate(string description, int scriptnumber); 
public void UpdateProgress(string description, int scriptnumber) { 
    if (treeView.InvokeRequired) { 
     treeView.Invoke(new UpdateProgressDelegate(UpdateProgress), new object[] { description, scriptnumber }); 
     return; 
    } 
    // Update the treeview 
} 
関連する問題