[英]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.