2013-11-20 54 views
0

我想将变量传递到延迟后运行的函数中。我已经看到了类似的问题如何做到这一点(见下文)。我不认为这是我想要的,因为每次调用method1时,附加的匿名函数的数量都会增加?我需要做的是在添加新的匿名函数之前删除任何现有的匿名函数。但我不认为这是可能的。有没有办法在延迟后调用方法,但每次都传递一个新的变量值?延迟后调用方法(带参数)

using System.Timers; 

myTimer = new Timer(); 
myTimer.Interval = 3000; 
myTimer.AutoReset = false; 

public void method1(int var1){ 
    myTimer.Elapsed += delegate { doSomething(var1); }; 
    myTimer.Start(); 
} 

public void doSomething(int arg1){...} 

UPDATE

基本上每当运行method1,我想要的东西后发生3秒,我需要在每一个可随时间变化的参数来传递。

我不认为我可以使用一个字段来存储变量,因为method1可能会在第一个计时器到期之前多次调用。即可能会有几个问题。例如。在一个时间点“DoSomething的”的阙等待发生可能是......

doSomething(3) 
doSomething(7) 
doSomething(1) 

它是在一个测试平台刚刚使用,method1将运行名为不超过50倍。我想确保每个doSomething(var1)只被调用一次,而不是每3秒调用一次。即每次调用method1时只有一个doSomething

这是一个Windows控制台应用程序。

+0

为什么不你将参数移动到一个字段并将其用作共享资源? – Redwan

+0

@Redwan,不能这样做,我已经更新了我的问题。 – spiderplant0

+0

变量中有什么样的数据?你是否希望每次针对不同的数据执行相同的逻辑,或者甚至可能执行不同的逻辑? – LeftyCoder

回答

3

有没有好方法使用System.Timers.Timer做到这一点。

使用System.Threading.Timer,可以将userState对象传递给构造函数。然后该对象被传递给定时器回调并且每次打勾。例如:

string Whatever = "foo"; 
System.Threading.Timer timer = 
    new System.Threading.Timer(MyTimerCallback, whatever, 100, 100); 

void MyTimerCallback (object state) 
{ 
    string theData = (string)state; 
    // at this point, theData is a reference to the "Whatever" string. 
    // do tick processing 
} 

你可以,如果你想,延长System.Timers.Timer,并添加一个属性来保存你的数据。例如:

class DerivedTimer : System.Timers.Timer 
{ 
    public string Foo { get; set; } 
} 

myTimer = new DerivedTimer(); 
myTimer.Interval = 3000; 

public void methodRunRegularly(int var1){ 
    myTimer.Foo = "Foobar!"; 
    myTimer.Elapsed += doSomething; 
    myTimer.Start(); 
} 

public void doSomething(object sender, EventArgs e) 
{ 
    var t = (DerivedTimer)sender; 
    var foo = t.Foo; 
    // do processing 
} 

sender参数中传递了对定时器的引用。您可以将其转换,然后引用在初始化计时器时设置的Foo属性。

3

这使用了Reactive Extensions(使用nuget包“rx-main”)。

运行的方法以3秒的延迟:

public void method1(int value) 
{ 
    ThreadPoolScheduler.Instance.Schedule(
     TimeSpan.FromSeconds(3),() => doSomething(value)); 
} 

这是我们所短,因为它得到!

5

使用TPL(& .NET 4.5),你可以做这样的事情:

​​

...或者这可能是您的应用程序更简单:

static async void DoSomethingLater(int n) 
{ 
    await Task.Delay(TimeSpan.FromSeconds(3)); 
    //DoSomething(n); 
} 

//usage 
void Method1(int n) 
{ 
    DoSomethingLater(n); 
} 
+0

哦,是啊!我没有“烘烤”“Task.Delay”,但是...很好。 async * void *虽然? :噢!仍然+ 1 –

+0

是的,我没有足够的上下文,但感觉'Method1'是一个事件处理程序,'async void' _应该没问题。 –