2015-02-12 2 views
0

Я новичок в использовании задачи в C#, у меня есть этот метод:Завершить задачу в C# приложении

public async void GetAnimateur(Action<List<fsign_fiche_signaletique>, Exception> callback) 
     { 
      try 
      { 
       Task<List<fsign_fiche_signaletique>> data = (Task<List<fsign_fiche_signaletique>>)Task.Run(
        () => 
        { 
         DataEntities _db = new DataEntities(); 
         _db.Configuration.LazyLoadingEnabled = false; 
         var dpcs = _db.fsign_fiche_signaletique.ToList(); 
         return new List<fsign_fiche_signaletique>(dpcs); 
        }); 
       var result = await data; 
       callback(result, null); 
      } 
      catch (Exception ex) 
      { 
       callback(null, ex); 
      } 
     } 

Мне нужно знать, как я могу остановить выполнение задачи и убить его тему после окончания обработки.

+3

Просто FYI, вы только [должны использовать async void в особых ситуациях] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx). Кроме того, что вы имеете в виду, убивая его потоки? Задача должна обрабатывать все это для вас (если она вообще использует новый поток, это может и не быть). Чего вы пытаетесь достичь? –

+1

TPL позаботится о возврате потока в threadpool для вас. Нет необходимости явно что-то прекращать. –

+0

@GeorgeMauer Мне просто нужно, чтобы задача выполнялась только один раз –

ответ

2

Невозможно остановить выполнение Task после того, как оно уже завершено, поскольку по определению , он уже прекратил выполнение.

Task.Run вернет нить пула потоков обратно в пул потоков, если пул использовался, или разрешить выделенную нить завершить и оторвать себя, если был использован новый поток.

Вам нечего делать явно.

+0

Или запустите сразу, синхронно, не создавая новый поток. Это также возможно :) –

+0

@GeorgeMauer Предположительно операция является асинхронной по уважительной причине, и важно, чтобы она не выполнялась синхронно. Конечно, он мог выполнять операцию асинхронно, не используя новый поток. – Servy

1

Для этого вы можете использовать CancellationToken, а затем в поле своей задачи периодически проверяйте его. См .: например

Но, похоже, что ваш код не особенно хорошо подходит для этого. Чтобы отменить задачу, ее можно разделить на разные этапы, что здесь не так.

Если ваше мышление больше прерывает задачу (возможно, из-за проблем с подключением к Интернету), вы должны просто дать задание соответствующий тайм-аут или, что еще проще, вернуться с него, как только вы столкнетесь с ошибкой.

EDIT: Или я ошибаюсь, и вы хотите прервать задачу после ее выполнения? Для этого вам нужно изобрести машину времени - если вам это удастся, сообщите мне; -) ...

Смежные вопросы