wywołać funkcję i nigdy nie czekać na nią w C #


26

Mam kontroler w mojej aplikacji internetowej mvc4, w której jest akcja, która musi wywołać inną funkcję. To, co dzieje się w tej funkcji, tj. Wartość zwracana, nie jest ważne dla mojego działania. Jak mogę wywołać tę funkcję i nigdy nie czekać na jej wykonanie?

Myślę, że można to zrobić za pomocą asynchronizacji, ale moim celem nie jest używanie zasobów, wystarczy wywołać funkcję i nigdy nie czekać na to, co się kiedykolwiek wydarzy.

Proszę o poradę.



Jedynym sposobem na to jest przekazanie go do innego wątku. Nie ma czegoś takiego jak wywoływanie funkcji bez zasobów, chyba że po prostu chcesz, aby była to opcja niedostępna.
Robert Harvey

dzięki, miałem na myśli najlepszy i zoptymalizowany sposób, myślę, że najlepszym sposobem jest Task.Run i używanie WebApi w MVC, na podstawie wspomnianego linku @ user814064, może mogę po prostu użyć rozwiązania JavaScript, ale myślę, że to nie jest profesjonalny!
user2675751,

Odpowiedzi:


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();
}

Pamiętaj, że rozpoczęcie metody bez dbania o wynik lub wyjątki, które może rzucać, jest ryzykowne.

Jeśli zostanie zgłoszony wyjątek Task, zostanie on ukryty, dopóki:

  1. Obserwuj wynik,
  2. Wait() do zadania lub:
  3. GC wywołuje finalizator na stronie Task.

Możesz obsłużyć siebie 1. i 2. wkrótce po wywołaniu metody lub możesz dołączyć kontynuację, myTask.OnComplete(myErrorHandler, TaskContinuationOptions.OnlyOnFaulted)która ma być uruchomiona, gdy oryginalne zadanie zgłosi wyjątek. 3. spowoduje awarię procesu; nie rób tego.


3
Czy możesz rozwinąć „3. spowoduje awarię procesu; nie rób tego”. Czy to nie jest zrobione automatycznie?
rdans
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.