> 백엔드 개발 > C++ > 비동기 대리자를 사용하여 C#에서 비동기 이벤트를 처리하는 방법은 무엇입니까?

비동기 대리자를 사용하여 C#에서 비동기 이벤트를 처리하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-08 12:41:41
원래의
1054명이 탐색했습니다.

How to Handle Asynchronous Events in C# Using Async Delegates?

C# 비동기 대리자: 비동기 이벤트를 정상적으로 기다립니다

C#에서 이벤트는 전통적으로 void를 반환하므로 비동기 작업과 호환되지 않습니다. 이 문제는 이벤트 핸들러가 다른 구성 요소에 알리기 전에 비동기 작업을 수행해야 할 때 발생합니다. 다음 시나리오에서는 이 문제를 살펴보고 비동기 대리자를 사용하여 솔루션을 제공합니다.

질문:

아래 코드는 게임이 종료될 때 실행되는 GameShuttingDown이라는 이벤트를 보여줍니다. 각 이벤트 핸들러는 게임이 종료되기 전에 데이터를 비동기적으로 저장해야 합니다. 그러나 핸들러는 void 메서드로 호출되어 저장이 완료되기 전에 게임이 닫히게 됩니다.

public event EventHandler<EventArgs> GameShuttingDown;

public async Task ShutdownGame()
{
    await this.NotifyGameShuttingDown();
    await this.SaveWorlds();
    this.NotifyGameShutDown();
}

private async Task SaveWorlds()
{
    foreach (DefaultWorld world in this.Worlds)
    {
        await this.worldService.SaveWorld(world);
    }
}

protected virtual void NotifyGameShuttingDown()
{
    var handler = this.GameShuttingDown;
    if (handler == null)
    {
        return;
    }

    handler(this, new EventArgs());
}
로그인 후 복사

해결책:

이 문제를 해결하기 위해 작업을 반환하는 비동기 대리자를 사용할 수 있습니다. 이렇게 하면 핸들러를 비동기적으로 호출하고 결과를 기다릴 수 있습니다.

기존 GameShuttingDown 이벤트를 비동기 대리자 유형으로 교체:

public event Func<object, EventArgs, Task> GameShuttingDown;
로그인 후 복사

핸들러를 호출하고 완료될 때까지 기다리도록 NotifyGameShuttingDown 메서드를 수정합니다.

protected virtual async Task NotifyGameShuttingDown()
{
    Func<object, EventArgs, Task> handler = GameShuttingDown;

    if (handler == null)
    {
        return;
    }

    Delegate[] invocationList = handler.GetInvocationList();
    Task[] handlerTasks = new Task[invocationList.Length];

    for (int i = 0; i < invocationList.Length; i++)
    {
        handlerTasks[i] = ((Func<object, EventArgs, Task>)invocationList[i])(this, EventArgs.Empty);
    }

    await Task.WhenAll(handlerTasks);
}
로그인 후 복사

사용법:

새로운 비동기 대리자 유형을 사용하여 GameShuttingDown 이벤트를 구독하세요.

DefaultGame.GameShuttingDown += async (sender, args) => await this.repo.Save(blah);
로그인 후 복사

이 접근 방식을 사용하면 이벤트 핸들러의 모든 비동기 저장 작업이 완료된 후에만 게임이 닫힙니다.

위 내용은 비동기 대리자를 사용하여 C#에서 비동기 이벤트를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿