I have a JavaScript code that I want to bring the idea into my C# project.
This code brings multiple function call into a single management delayed call.

Here is the JavaScript code:

  var ArgumentsCollection = [] ;
  var to_TimeOut = null ;

  function QueueWorkRunOnce(Argument) {
  clearTimeout(to_TimeOut);
  ArgumentsCollection.push(Argument) ;
        to_TimeOut = setTimeout(/* delegate */ function(){                  
            Worker(ArgumentsCollection); 
            //Reset ArgumentsCollection
            ArgumentsCollection = [] ;

        },/*Delay in ms*/ 1000 );
    }
    function Worker(Collection){
        alert(Collection.join(" ")) ;
    }

    onload = function(){
        QueueWorkRunOnce("Hi")
        //Some other stuff
        QueueWorkRunOnce("There")
        //Some other stuff
        QueueWorkRunOnce("Hello")
        QueueWorkRunOnce("World")

        //after Xms + 1000ms Will alert("Hi There Hello World") ;
    }()
有帮助吗?

解决方案

Here's a rough translation to get you started:

var worker = new Action<IEnumerable<string>>(collection =>
{
    Console.WriteLine(string.Join(" ", collection));
});

var args = new List<string>();
var timer = new Timer(state =>
{
    worker(args);
    //Reset args
    args.Clear();
});

var queueWorkRunOnce = new Action<string>(arg =>
{
    args.Add(arg);
    timer.Change(/*Delay in ms*/ 1000, Timeout.Infinite);
});

queueWorkRunOnce("Hi");
//Some other stuff
queueWorkRunOnce("There");
//Some other stuff
queueWorkRunOnce("Hello");
queueWorkRunOnce("World");

Console.ReadKey();

Making this thread-safe is left as an exercise for the reader.

其他提示

Here is the same code modified.. Work for me
if anyone can contribuete an thread safe version that will be great.

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace QueueWorkRunOnce {
public class Test {

    public static void worker(List<string> collection) {
        Console.WriteLine(string.Join(" ", collection.ToArray()));
    }

    public static List<string> args = new List<string>();

    public Timer timer = new Timer(state => {
        worker(args);
        args.Clear();
    });

    public void queueWorkRunOnce(string arg){
        args.Add(arg);
        timer.Change(/*Delay in ms*/ 1000, Timeout.Infinite);
    }

    public Test() {
        Console.WriteLine("new Test");

        queueWorkRunOnce("Hi");
        //Some other stuff
        queueWorkRunOnce("There");
        //Some other stuff
        queueWorkRunOnce("Hello");
        queueWorkRunOnce("World");           
    }
}
class Program {
    static void Main(string[] args) {
        new Test();
        Thread.Sleep(3000);
        new Test();
        Console.ReadKey();
    }
}

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top