4

私はこのコードを手に入れました(まあ、似たようなものです)。

private delegate void GenericCallback<T>(T Info);

private void DoWork()
{
    System.Threading.Thread Worker = new System.Threading.Thread(
            delegate() 
            {
                TestMethod(TestMethodCallback<string>);
            }
    );
    Worker.Start();
}

private void TestMethod(GenericCallback<string> Callback)
{
    System.Threading.Thread.Sleep(1000);
    if(Callback != null)
    {
        Callback("Complete");
    }
}

private void TestMethod(GenericCallback<int> Callback)
{
    System.Threading.Thread.Sleep(1000);
    if(Callback != null)
    {
        Callback(25);
    }
}

private void TestMethodCallback<T>(T Info)
{
    MessageBox.Show(Info.ToString());
}

TestMethodこれにより、パラメーターの型に基づいてさまざまなバージョンの を呼び出すことができると同時に、単一のコールバック メソッドを持つこともできます。

これは悪い形ですか、それとも受け入れられている慣行ですか?

4

4 に答える 4

8

Action デリゲート タイプを探しているようです。これは基本的にここにあるものです: 一般的な void を返すデリゲート型です。

于 2012-08-30T14:35:53.420 に答える
5

そのような確立された慣習により、作業の一部があなたのために行われました。Actionこの場合、Func値を返す必要があるのは、まさにこのように、一般的なデリゲートです。利点は、あなたの署名を見た場合:

private void TestMethod(GenericCallback<string> Callback)

GenericCallback<string>があるか調べる必要があります。私が見た場合:

private void TestMethod(Action<string> callback)

もう知っている。

于 2012-08-30T14:39:40.077 に答える
1

まったく問題ありません。この非常に単純なケースでは、文字列を指定することをお勧めします (制約のないジェネリック型はオブジェクトとしてのみ処理できるため、ToString() は何があっても呼び出すことができる非常に数少ない便利なものの 1 つです)。あなたは合格します)、しかし明らかにこれはサンプルコードであるため、これを行うには非常に多くの受け入れられた方法があります. Action<>確かに知っておくとFunc<>便利なビルトインですが、自己文書化が減るなどの欠点があります (明らかな「整数を取得して整数を返す」以外に、 Func が何をすることが期待されているかを伝えるのは難しい場合があります)。 "。

于 2012-08-30T14:48:49.723 に答える
0

これがデータを非同期に返すために使用されると仮定すると (そうでない場合は、戻り値を待つ必要はありません)、Task Parallel Libraryを発見していないように思えます。特に、Task<T>コールバックのような動作を実現するためのより一般的な方法です。

例えば:

private Task<int> TestMethod()
{
    TaskCompletionSource<int> tcs=new TaskCompletionSource<int>();
    //do something asynchronous
    //when asynchronous job is complete
    //tcs.SetResult(25);
    return tcs.Task;

}
于 2012-08-30T14:39:29.860 に答える