微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决事件被调用后停止等待 (Task.Delay(-1))

我有这样的代码

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 必须结束/执行返回而不是等待?

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

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 并对其调用取消,这将启动对令牌的取消调用。

can only be called from completion function
,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。