回调方法C#

时间:2011-04-13 16:14:39

标签: .net c#-4.0

我需要为我的Commit方法创建一个回调方法,只是为了知道它何时完成。 所以任何人都知道如何做到这一点,我怎么能够调用commmit,然后订阅回调事件/方法来做其他事情。

6 个答案:

答案 0 :(得分:4)

通常,在C#中,您可以通过event执行此操作。处理此问题的最常用方法是使用Event-based Asynchronous Programming model。这将按照惯例将您的API定义为:

public void YourMethodAsync() {}  // starts your method
public Event EventHandler<YourEventArgs> YourMethodCompleted; // Event used to receive completion notification

话虽如此,如果您正在为.NET 4开发,您可能需要考虑围绕TaskTask<T>类设计方法。您可以直接返回Task,而不是创建回调。这允许您的用户创建在操作完成时运行的任务延续。此外,未来的C#版本将允许用户利用当前采用CTP格式的 await async 关键字来简化开发。

答案 1 :(得分:3)

定义Commit方法以接受Action类型的参数。

然后你可以将函数作为回调参数传递给Commit方法。

e.g:

public void Commit(Action CommitCallback)
{
    //Code to handle Commit
    CommitCallback();
}


.
.
.
.
//Somewhere in your code:

Commit(()=>{ Console.WriteLine("Commit finished");});

或定义方法

Commit(CommitPostProcessing);

public void CommitPostProcessing()
{
    //Some code
}

答案 2 :(得分:2)

您可以使用活动,但它们可能会很快变得混乱。因此,要使用回调,请假设您的Commit方法的签名目前看起来像这样,

void Commit() { }

您可以使用委托轻松添加回调,假设您在回调中接受CommitResult类型的参数,

void Commit(Action<CommitResult> callback) { }

您可以使用多种方式,首先使用lambda,

obj.Commit(result => Console.Write(result));

或使用其他方法,

obj.Commit(CallbackMethod);

void CallbackMethod(CommitResult result)
{
    Console.WriteLine(result);
}

答案 3 :(得分:2)

您需要使用活动。

 public class LongOperation
{
    public event EventHandler Committed;

    public void Commit()
    {
        //Do you stuff here.
        //Call OnComitted once finished.
        OnCommitted(new EventArgs());
    }

    protected void OnCommitted(EventArgs e)
    {
        EventHandler handler = Committed;
        if (handler != null) 
            handler(this, e);
    }
}

使用以下来自调用对象的代码:

        LongOperation operation = new LongOperation();
        operation.Committed += new EventHandler(operation_Committed);
        operation.Commit();
...

    void operation_Committed(object sender, EventArgs e)
    {
        //Do extra stuff here....
    }

答案 4 :(得分:0)

根据建议,你可以使用事件,这是一个原始的例子:

public MyClass
{
    public event EventHandler Comitted;

    public void Commit()
    {
        //committing code
        if (Comitted != null)
        {
            Committed(this, new EventArgs());
        }
    }
}

我们检查null Comitted的原因仅仅是因为可能没有订阅者。那么,如何订阅?您需要一个方法,其签名与事件的EventHandler类型匹配,当此方法触发时,它是Commit完成的指示符,然后使用您需要委派事件类型的实例:

var myClass = new MyClass();
myClass.Committed += OnCommitted;
myClass.Commit();

void OnCommitted(object sender, EventArgs e)
{
    //event handler code
}

答案 5 :(得分:0)

您可以实施观察者模式http://en.wikipedia.org/wiki/Observer_pattern并订阅

您可以使用代理http://msdn.microsoft.com/en-us/library/018hxwa8.aspx来致电

您可以创建一个触发http://msdn.microsoft.com/en-us/library/awbftdfh.aspx并调用它的事件

可能还有其他一些方法,那就是我的三个方面。