2013-11-20 55 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' _應該沒問題。 –