【问题标题】:Nonblocking sleep in C#5.0 (like setTimeout in JavaScript)C#5.0 中的非阻塞睡眠(如 JavaScript 中的 setTimeout)
【发布时间】:2011-11-29 13:56:05
【问题描述】:

什么是 JavaScript 的 setTimeout(callback, milliseconds) 以新的“异步”风格模拟 C#?

例如,如何将以下 continuation-passing-style JavaScript 重写为现代支持异步的 C#?

JavaScript:

function ReturnItAsync(message, callback) {
    setTimeout(function(){ callback(message); }, 1000);
}

C#-5.0:

public static async Task<string> ReturnItAsync(string it) {
    //return await ... ?
}

【问题讨论】:

    标签: c# c#-5.0


    【解决方案1】:

    AsyncCTP 有TaskEx.Delay。这将计时器包装在您的任务中。请注意,这不是生产就绪代码。当 C# 5 到来时,TaskEx 将合并到 Task

    private static async Task ReturnItAsync(string it, Action<string> callback)
    {
        await TaskEx.Delay(1000);
        callback(it);
    }
    

    或者如果你想返回it:

    private static async Task<string> ReturnItAsync(string it, Func<string, string> callback)
    {
        await TaskEx.Delay(1000);
        return callback(it);
    }
    

    【讨论】:

      【解决方案2】:

      当我需要模仿 JavaScript 的 setTimeout(callback, milliseconds) 函数时,我使用以下代码:

      将工作调度到线程池(即发即弃的非阻塞调度):

      Task.Run(() => Task
                  .Delay(TimeSpan.FromSeconds(1))
                  .ContinueWith(_ => callback(message)));
      

      当人们可以在延迟过去之前提供取消令牌来取消任务时,这种情况会有所不同。除非我误解了,否则 Ilian Pinzon 选择的答案更适合等待的情况,在即发即弃 (JavaScript) 的情况下,这不是您想要的。

      注意:TimeSpan.FromSeconds(1) 是为了方便起见,如果需要毫秒,则可以避开整个 TimeSpan 以支持毫秒值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        • 2020-03-29
        • 2011-07-23
        相关资源
        最近更新 更多