我知道这是非常基本的东西,但我正在努力思考它。
好的,我有一个我想要运行的方法:
public static void DelegateTest(string testStuff)
{
for (int i = 0; i < 4; i++)
{
Console.WriteLine(testStuff);
}
}
然后,在这个方法的范围之外(但是在我的类的范围内),我使用与我的方法相同的输出类型和输入参数来定义我的委托:
public delegate void myDelegate(string test);
我像这样实例化我的委托:
myDelegate md = new myDelegate(DelegateTest);
然后我可以通过BeginInvoking委托开始我的方法多次,并且方法将在不同的线程中并行运行。
md.BeginInvoke("Hello World", null, null);
md.BeginInvoke("Hello World Again", null, null);
md.BeginInvoke("Hello World A Third Time", null, null);
我现在如何定义一个事件,并且只在事件发生时异步启动我的方法?此外,事件的内容有何限制?可以将计算机上发生的任何事情或多或少地定义为事件或仅定义某些事物?
编辑:例如,在执行上述操作后,我想创建一个事件并将此事件定义为“已按下空格键”。每次按下空格键时,都会发生这种情况。当事件发生时,我想异步启动我的方法,如果没有按空格键,我不想异步启动我的方法。
我该怎么做?
答案 0 :(得分:3)
只需使用Invoke而不是BeginInvoke进行同步调用。
编辑:根据ThePower的回答,你不需要调用,你可以像调用函数一样调用你的代理(因为它是!)。
EDIT2:您实际上是在尝试注册事件处理程序。为此,您无需创建自己的委托。在WinForms中处理KeyPress事件的示例:
public class MyForm : Form
{
public MyForm()
{
KeyPress += OnKeyPressHandler;
}
private void OnKeyPressHandler(object sender, KeyPressEventArgs keyPressEventArgs)
{
//TODO: whatever you need to do...
}
}
答案 1 :(得分:1)
如果您想将其用作event
,请查看事件类型。有一个很好的例子here。
虽然,如果你想使用你的代表......
您已经定义了Asynchronous,因此对于Synchronous use:
md("Hello World", null, null);
md("Hello World Again", null, null);
md("Hello World A Third Time", null, null);
答案 2 :(得分:0)
我不确定我完全理解你的问题。在C#中,出于所有实际目的,事件是委托,这意味着任何委托都可以用作事件。
使用您的示例:
public delegate void MyDelegate(string test);
现在,您可以将MyDelegate
用作课程中的事件:
public class MyClass
{
public event MyDelegate MyEvent;
}
您现在可以使用MyEvent
注册事件处理程序,然后在事件处理程序中可以执行所需的任何代码。从传统意义上讲,这是在C#中定义事件的唯一方法。
要考虑的另一个选择是使用发布/订阅模式,例如EventAggregator
。此模式通常不依赖于委托,而是依赖于聚合器对象来通知所有订阅者已发布的事件。在这种情况下,事件实际上可以是包含订阅者期望的信息的任何对象。