2016-08-12 3 views
0

Ich habe asynchroner Rückruf, die in Timer (von System.Threading) übergeben wird Konstruktor:Pass asynchroner Rückruf zu Timer-Konstruktor

private async Task HandleTimerCallback(object state) 
    { 
     if (timer == null) return; 

     if (asynTaskCallback != null) 
     { 
      await HandleAsyncTaskTimerCallback(state); 
     } 
     else 
     { 
      HandleSyncTimerCallback(state); 
     } 
    } 

Und Timer:

timer = new Timer(async o => await HandleTimerCallback(o), state, CommonConstants.InfiniteTimespan, 
      CommonConstants.InfiniteTimespan); 

Gibt es eine Möglichkeit auszulassen dass o param in Lambda? Ursache für nicht-Asynchron kann ich nur passieren mein handler als Delegierter

timer = new Timer(HandleTimerCallback, state, CommonConstants.InfiniteTimespan, 
      CommonConstants.InfiniteTimespan); 
+0

Es ist wirklich keinen Sinn macht diese Vermischung von Timer zu tun und Asynchron/await. Wenn Sie Timer-Verhalten in async/await world haben möchten, machen Sie einfach eine Schleife mit einem 'wait Task.Delay (someValue)' irgendwo im Schleifenkörper und rufen Sie Ihre Methode auch vom Schleifenkörper auf. – spender

Antwort

2

Gibt es eine Möglichkeit, dass die o param in Lambda wegzulassen?

Sicher, definieren Sie einfach Ihre Event-Handler-Methode als async void:

private async void HandleTimerCallback(object state) 
+0

Meinst du ohne Methode Körper? Und warum nicht "Aufgabe", sondern "nichtig"? – demo

+1

@demo: Weil ['TimerCallback' einen Rückgabetyp von' void' hat (https://msdn.microsoft.com/en-us/library/system.threading.timercallback (v = vs.110) .aspx) . –

+0

danke, ich verstehe – demo