创建等待任务,循环到true或超时

Kyl*_*yle 5 c# async-await

我试图使用下面的函数不返回true/false,除非布尔函数arg返回true或超时到期.在当前状态下,如果布尔函数arg返回false,则立即返回false而不是循环并重试X更多毫秒.

 public delegate bool BooleanFunction ();

    public static async Task<bool> Wait(uint Milliseconds, BooleanFunction Function)
    {
        var StartTime = Environment.TickCount;

        do
        {
            if (Function())
            {
                return true;
            }

            Thread.Yield();
        }
        while (Environment.TickCount < StartTime + Milliseconds);

        return false;
    }
Run Code Online (Sandbox Code Playgroud)

Ned*_*nov 3

你需要使用await Task.Yield而不是Thread.Yield

    if (Function())
    {
        return true;
    }

    await Task.Yield();
Run Code Online (Sandbox Code Playgroud)

如果您还想处理将异步委托传递给Wait,请保留现有版本并添加以下重载:

public static async Task<bool> Wait(uint Milliseconds, Func<Task<bool>> Function)
{
    var StartTime = Environment.TickCount;

    do
    {
        if (await Function())
        {
            return true;
        }

        Thread.Yield();
    }
    while (Environment.TickCount < StartTime + Milliseconds);

    return false;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

   var result = await Wait(10000, async () => await Test());     
Run Code Online (Sandbox Code Playgroud)