Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET/C中完成事件后运行操作#_C#_Events_Event Handling - Fatal编程技术网

C# 在.NET/C中完成事件后运行操作#

C# 在.NET/C中完成事件后运行操作#,c#,events,event-handling,C#,Events,Event Handling,行动1 触发事件1 事件2 按这个顺序 Action2也会触发Event2 我需要在触发并完成Event1之后执行一个方法 我如何在C#/.NET中实现这一点 关键是我需要在事件完成时执行该方法,因为只有这样我才能访问对象的某些属性 我想在类级别全局添加一个变量,并在Event1处理程序中为其赋值。 然后在Event2处理程序内部检查变量是否已初始化,这意味着我们正处于完成Event1的阶段。然后在Event2处理程序中添加我的方法 这似乎不起作用,因为在执行Action2(我不关心这个操作)时

行动1 触发事件1 事件2 按这个顺序

Action2也会触发Event2

我需要在触发并完成Event1之后执行一个方法

我如何在C#/.NET中实现这一点

关键是我需要在事件完成时执行该方法,因为只有这样我才能访问对象的某些属性

我想在类级别全局添加一个变量,并在Event1处理程序中为其赋值。 然后在Event2处理程序内部检查变量是否已初始化,这意味着我们正处于完成Event1的阶段。然后在Event2处理程序中添加我的方法

这似乎不起作用,因为在执行Action2(我不关心这个操作)时,Event2会非常频繁地触发,并且会收到堆栈溢出错误消息。 有没有一个好的方法可以让它真正发挥作用

我可以(如何)做一些事情,比如覆盖库并添加一个在现有事件完成时触发的新事件(不做任何事情);然后,我将使用新事件将处理程序附加到它,并将我的方法放在那里

这些事件和操作是框架固有的,因此我对它们没有太多的控制,因为它们的定义隐藏在.net库中。 因此,我对一些一般原则和技巧感兴趣,这些是限制/挫折


这里可以找到一些示例代码:

事件处理本质上是同步的(假设有人不使用
async void
或在处理程序中启动自己的线程),因此以下代码:

Event1?.Invoke();
//Do stuff after Event1

我已经按照你的要求做了。如果您需要等待由
Event1
处理程序启动的某个异步任务,那么除了事件调用过程之外,您还需要执行该任务。

为什么不将其添加到Event1调用程序?如果您的编辑是为了解决我的答案,我不知道您在说什么,事件处理程序在
Invoke
returnsSorry Bradley之后已完成执行,我还没有看到您的答案。感谢您抽出时间回答。顺便问一下,我在哪里调用它?由于每次触发event1类型的事件时都需要此方法,因此我是否会为event1创建一个处理程序,如…Instance.Move+=new PageEventHandler(myHandler)然后执行Move.Invoke in myHandler?@ringosstaro-只是事件的另一个处理程序-处理程序一个接一个地运行,因此在第一个处理程序完成后,第二个处理程序将只运行。是的,这会起作用。或者,请确保所有事件调用都通过相同的方法,然后在我的回答中使用该方法。除了事件调用过程之外,我如何执行此操作?@AndrewPaes,这取决于您的应用程序。事件不应返回值,因此您无法固有地跟踪事件处理程序异步操作何时完成。我建议使用某种类型的
TaskCompletionSource