Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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# 在扩展方法中添加事件侦听器_C#_Events_Async Await_Event Handling - Fatal编程技术网

C# 在扩展方法中添加事件侦听器

C# 在扩展方法中添加事件侦听器,c#,events,async-await,event-handling,C#,Events,Async Await,Event Handling,在我的主课上,我有这样的活动 private event System.Action OnActionFinished; 知道await调用GetAwaiter()方法,我有System.Action扩展方法: ` OnActionFinished在Walk、Jump和shot方法的末尾被调用 为什么这不起作用?操作是一种不可变的类型。您并没有更改该操作,使其在被调用时执行不同的行为,而是创建了一个新的操作(然后您将不进行任何操作)来完成TCS 一般来说,能够基于任意事件构造任务是相当困难的,

在我的主课上,我有这样的活动

private event System.Action OnActionFinished;
知道await调用GetAwaiter()方法,我有System.Action扩展方法: `

OnActionFinished在Walk、Jump和shot方法的末尾被调用


为什么这不起作用?

操作
是一种不可变的类型。您并没有更改该操作,使其在被调用时执行不同的行为,而是创建了一个新的操作(然后您将不进行任何操作)来完成TCS

一般来说,能够基于任意事件构造
任务
是相当困难的,而且完全使用类型安全性是不可能的。现在,要基于特定对象上的特定事件创建
任务
,当然,这很简单(同样,请参见前面链接的问题)


这主要源于C语言本身在事件周围所暴露的特性,而这一点是不允许的。

谢谢你,你为我指明了正确的方向。您认为如何?@括号它不起作用,因为您无法获取对表示事件的操作的引用。在一般情况下,传递给该方法的任何内容都不会影响事件。如果您使用自定义处理程序专门实现了一个事件,并使用您可以直接访问的委托对其进行支持,那么您可以这样做,但这是完全不同的。
public static TaskAwaiter<object> GetAwaiter(this Action action)
{
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    action += () => tcs.SetResult(null);
    return tcs.Task.GetAwaiter();
}
public async Task ExecuteTurns(Queue<TurnAction> turnActions)
{
    foreach (TurnAction turn in turnActions)
    {
        Action<Vector2> TurnMethod = null;
        switch (turn.TurnType)
        {
            case TurnType.Walk:
                TurnMethod = Walk;
                break;
            case TurnType.Jump:
                TurnMethod = Jump;
                break;
            case TurnType.Shoot:
                TurnMethod = rangedWeapon.Shoot;
                break;
        }
        Task.Run(async () => {
            TurnMethod(turn.Direction);
            });
        await OnActionFinished;
    }
}