簡體   English   中英

在擴展方法中添加事件偵聽器

[英]add event listener in extension method

在我的主班,我有這樣的事件

private event System.Action OnActionFinished;

並且知道 await 調用 GetAwaiter() 方法,我有 System.Action 擴展方法:`

public static TaskAwaiter<object> GetAwaiter(this Action action)
{
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    action += () => tcs.SetResult(null);
    return tcs.Task.GetAwaiter();
}

為了能夠寫await OnActionFinished; async方法中。

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;
    }
}

OnActionFinished 在 Walk、Jump 和 Shoot 方法的末尾被調用。

為什么這不起作用?

Action是不可變的類型。 您不會更改該操作以使其在調用時執行不同的行為,而是創建一個新操作(然后您什么都不做)來完成您的 TCS。

一般地能夠基於任意事件構造一個Task是相當困難的,並且在完全類型安全的情況下做到這一點是不可能的。 您可以在這里看到這樣做的一些困難 現在要根據特定對象上的特定事件創建Task ,當然,這很容易(同樣,請參閱之前鏈接的問題)。

這主要源於 C# 語言本身圍繞事件公開的特性,只是不允許這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM