викликати функцію і ніколи не чекати її в C #


26

У моєму веб-додатку mvc4 є контролер, в якому є дія, яку потрібно викликати іншою функцією. Що відбувається в цій функції, тобто повернене значення, не важливо для моєї дії. Як я можу викликати цю функцію і ніколи не чекати її виконання?

Я думаю, що це можна зробити за допомогою асинхронізу, але моя думка не в тому, щоб використовувати ресурси, просто зателефонуйте до функції і ніколи не чекайте того, що коли-небудь станеться.

Будь ласка, дайте мені поради.



Єдиний спосіб зробити це - передати його в іншу нитку. Немає такої речі, як викликати функцію без ресурсів, якщо ви просто не хочете, щоб вона була неоперативною.
Роберт Харві

дякую, я мав на увазі, що найкращий і оптимізований спосіб, я думаю, що найкращий спосіб - це Task.Run та використання WebApi в MVC, на основі згаданого посилання @ user814064, можливо, я можу просто використовувати рішення Javascript, але я думаю, що це не так професійний!
user2675751

Відповіді:


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

Зауважте, що починати метод, не піклуючись про результат чи про винятки, які він може кинути, є ризикованим.

Якщо виняток буде кинуто в a Task, воно буде приховано, поки ви:

  1. Дотримуйтесь результату,
  2. Wait() для завдання, або:
  3. GC викликає фіналізатор на Task.

Ви можете впоратися з 1. і 2. незабаром після виклику методу, або ви можете приєднати продовження myTask.OnComplete(myErrorHandler, TaskContinuationOptions.OnlyOnFaulted)до запуску, коли оригінальне завдання кидає виняток. 3. зірве ваш процес; не роби цього.


3
Чи можете ви розгорнути на "3. призведе до краху вашого процесу; не робіть цього". Це не робиться автоматично?
rdans
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.