chiama una funzione e non aspettare mai in C #


26

Ho un controller nella mia applicazione Web mvc4 in cui è presente un'azione che deve chiamare un'altra funzione. Cosa succede in quella funzione, cioè il valore di ritorno non è importante per la mia azione. Come posso chiamare quella funzione e non aspettare mai che venga eseguita?

Penso che possa essere fatto in modo asincrono, ma il mio punto non è quello di utilizzare le risorse, basta chiamare la funzione e non aspettare mai che ciò accada mai.

Per favore, dammi qualche consiglio.



L'unico modo per farlo è passarlo a un altro thread. Non è possibile chiamare una funzione senza risorse, a meno che tu non voglia semplicemente che sia una no-op.
Robert Harvey,

grazie, intendevo qual è il modo migliore e ottimizzato, penso che il modo migliore sia Task.Run e usando WebApi in MVC, basato sul link @ user814064 menzionato, forse posso semplicemente usare una soluzione javascript, ma penso che non lo sia professionale!
user2675751

Risposte:


40
private void Demo()
{
    // Do something, given that the result doesn't matter.
}

public void Do()
{
    Task.Factory.StartNew(this.Demo);

    // The following line will be executed without waiting for the result.
    DoSomethingElse();
}

Si noti che l'avvio di un metodo senza preoccuparsi del risultato o delle eccezioni che può generare è rischioso.

Se viene generata un'eccezione in a Task, verrà nascosta fino a quando:

  1. Osservare il risultato,
  2. Wait() per l'attività oppure:
  3. Il GC chiama il finalizzatore sul Task.

Puoi gestirti 1. e 2. poco dopo aver chiamato il metodo, oppure puoi allegare una continuazione myTask.OnComplete(myErrorHandler, TaskContinuationOptions.OnlyOnFaulted)da eseguire quando l'attività originale genera un'eccezione. 3. interromperà il processo; non farlo.


3
Potresti espandere su "3. si bloccherà il tuo processo, non farlo". Non è fatto automaticamente?
rdans,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.