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.