调用事件后停止等待 (Task.Delay(-1))

Stop waiting (Task.Delay(-1)) after event was invoked

我有这样的代码

public async Task DoStuff()
{
    _client.Ready += () => client_Ready("test");

    await Task.Delay(-1);
}

private async Task client_Ready(string message)
{
    await _client.SendMessageAsync(message);
}

我怎么能说在 client_Ready 被调用后整个 DoStuff 必须 end/perform return 而不是等待?

是否有一种“不错”的方式来做到这一点,或者我必须做一些工作,比如抛出异常并在“上方”捕获它?

MRE:

using System;
using System.Threading.Tasks;

public class Program
{
    public static async Task RandomlyDelayedStuff()
    {
        Console.WriteLine("this ended");
        await Task.Delay(200);
    }

    public static async Task DoStuff()
    {
        var rnd = new Random();

        await Task.Delay(rnd.Next(0, 5000)).ContinueWith(async task =>
        {
            await RandomlyDelayedStuff();
        });

        await Task.Delay(-1);
    }
    public static async Task Main()
    {
        await DoStuff();
        Console.WriteLine("ended");
    }
}

使用取消令牌。将令牌传递给延迟调用。您可以创建一个 CancellationTokenSource 并对其调用取消,这将启动对令牌的取消调用。

CancellationTokenSource cancelTokenSource = new CancellationTokenSource();

public async Task DoStuff()
{
    _client.Ready += () => client_Ready("test");

    await Task.Delay(-1, cancelTokenSource.Token);

    // do something else here if desired
}

private async Task client_Ready(string message)
{
    await _client.SendMessageAsync(message);
    cancelTokenSource.Cancel();
}

应该能够通过取消令牌完成此操作。

代码未经测试,我已经延迟完成,并使用取消重置,但从未使用无限计时器和取消。

const int cDelayMS = -1;
private System.Threading.CancellationTokenSource mCancel = new();

DoStuff()
{
    Task.Delay(cDelayMS, mCancel.Token).ContinueWith(
                async antecedent =>
                {
                    if (antecedent.Status == TaskStatus.Canceled)
                    {
                        // do whatever here
                    }
                });
}