在VB6中,在ActiveX组件中创建的事件如下所示:
公共事件处理完成()
并调用ActiveX组件,如:
RaiseEvent ProcessingComplete
我正在创建一个托管C ++ DLL,我想做同样的事情。它看起来不像代表正是我想要的。我认为更合适的项目是__event声明。帮助?!?
最后,我有一个C#应用程序,我希望有这样的函数:
MyObject :: ProcessingComplete()< ---当发生“RaiseEvent”时,这是被调用的函数。 {
}
感谢。
答案 0 :(得分:1)
听起来好像你想要一个活动。在.NET中,事件只是一个委托,按惯例,它具有特殊签名。这是在类中声明事件的C#示例:
public class MyObject
{
// ...
public event EventHandler ProcessingComplete;
// ...
}
EventHandler是一个具有两个参数的委托:
public delegate EventHandler(object sender, EventArgs e);
发件人是引发事件的对象,EventArgs会将您要传递给事件订阅者的任何信息编码。
每个活动都应遵循这一惯例。如果您希望传达事件的专用信息,可以创建自己的EventArgs派生类。 .NET为此目的定义了一般类型的EventHandler委托EventHandler<TEventArgs>
。 C#示例:
class ProcessingCompleteEventArgs : EventArgs
{
public ProcessingCompleteEventArgs(int itemsProcessed)
{
this.ItemsProcessed = itemsProcessed;
}
public int ItemsProcessed
{
get;
private set;
}
}
// ...
// event declaration would look like this:
public event EventHandler<ProcessingCompleteEventArgs> ProcessingComplete;
要订阅活动,请使用+=
运算符。要取消订阅,请使用-=
运算符。
void Start()
{
this.o = new MyObject();
this.o.ProcessingComplete += new EventHandler(this.OnProcessingComplete);
// ...
}
void Stop()
{
this.o.ProcessingComplete -= new EventHandler(this.OnProcessingComplete);
}
void OnProcessingComplete(object sender, EventArgs e)
{
// ...
}
在您的类中,要触发事件,您可以使用常规语法来调用委托:
void Process()
{
// ...
// processing is done, get ready to fire the event
EventHandler processingComplete = this.ProcessingComplete;
// an event with no subscribers is null, so always check!
if (processingComplete != null)
{
processingComplete(this, EventArgs.Empty);
}
}
答案 1 :(得分:0)
活动和代表。
摘要:委托是一个类 可以保存对方法的引用。 与其他类不同,是委托类 有签名,它可以容纳 仅引用匹配的方法 它的签名。
Events in Managed C++: Problem with Events, WindowEvents
Managed Extensions: Using Delegates and Events
总结:.NET编程包括 代表和事件的概念 促进观察员或 发布/订阅设计模式。最 次,你使用大致相同的事件 回调函数的方式 已在标准Win32中使用多年 API或MFC编程。
答案 2 :(得分:0)
我想代表们可以走了。
public delegate void ProcessCompleteEventHandler(object sender, EventArgs e);
在课堂外的某处定义上述内容。在课堂内
class MySampleClass{
public event ProcessCompleteEventHandler ProcessComplete;
void SomeWork()
{
//Do some work, and when its over...
ProcessComplete.Invoke(this, null);
}
}
在主程序中:
MySampleClass obj = new MySampleClass();
obj.ProcessComplete += new ProcessCompleteEventHandler(my_handler);
my_handler应该有相同的签名......