我需要为我的Commit方法创建一个回调方法,只是为了知道它何时完成。 所以任何人都知道如何做到这一点,我怎么能够调用commmit,然后订阅回调事件/方法来做其他事情。
答案 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开发,您可能需要考虑围绕Task
或Task<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并调用它的事件
可能还有其他一些方法,那就是我的三个方面。