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() 是您无论如何都可以调用的极少数有用的东西之一你通过了),但显然这是示例代码,所以有很多公认的方法可以做到这一点。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 回答