1

在 VB6 中,ActiveX 组件中创建的事件是这样声明的:

公共事件处理完成()

并调用该 ActiveX 组件,如:

引发事件处理完成

我正在创建一个我想要做同样事情的托管 C++ DLL。它看起来不像代表正是我想要的。我认为更合适的项目是 __event 声明。帮助?!?

最后,我有一个 C# 应用程序,我想拥有这样的功能:

MyObject::ProcessingComplete() <--- 这是发生“RaiseEvent”时调用的函数。{

}

谢谢。

4

3 回答 3

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);
    }
}
于 2009-08-28T06:30:00.687 回答
0

活动和代表。

活动和代表

总结:委托是一个可以持有对方法的引用的类。与其他类不同,委托类具有签名,并且它只能保存对与其签名匹配的方法的引用。

托管 C++ 中的事件:事件、WindowEvents 的问题

托管扩展:使用委托和事件

总结:.NET 编程包括委托和事件的概念,以促进观察者或发布/订阅设计模式。大多数时候,您使用事件的方式与多年来在标准 Win32 API 或 MFC 编程中使用回调函数的方式非常相似。

于 2009-08-28T06:25:07.577 回答
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 应该有相同的签名...

于 2009-08-28T06:26:41.380 回答