как добавить токен отмены в задачу?

Я знакомлюсь с Task и зашел так далеко:

В основном:

 Task<double> t = Task.Run(TW.DoingMegaFlops_Async);

Где в классе TW:

 public async Task<double> DoingMegaFlops_Async()
 {...await ...; return 0.0;}

Мое концептуальное консольное приложение строится и работает просто отлично. Проблема в том, как расширить это с помощью Cancellation Token. Я пробовал это:

CancellationTokenSource wtokenSource= new CancellationTokenSource();
Task.Run(TW.DoingMegaFlops_Async(wtokenSource.Token), wtokenSource.Token);

и в классе TW:

public async void DoingMegaFlops_Async(CancellationToken wtoken)
{...await...; return;}

Ошибка сборки в Main:

Cannot convert from 'void' to 'System.Action'

Я уже заморочился с кастингом на (Action), но безрезультатно. На самом деле, я не очень понимаю, что я здесь делаю, поэтому хотел бы узнать из форума.

Как видно из фрагментов кода, я уже урезал интерфейс метода Async, перейдя к возвращаемому типу void. Не знаю, действительно ли это облегчило ситуацию.


person Roland    schedule 13.10.2016    source источник
comment
Не используйте async void   -  person stuartd    schedule 13.10.2016
comment
Действительно, я бы предпочел вернуть некоторые полезные данные. Вот почему мне нужен токен отмены, чтобы, когда приложение останавливается, я мог остановить задачу чистым способом и показать некоторые данные о результатах задачи.   -  person Roland    schedule 13.10.2016


Ответы (1)


Task.Run(TW.DoingMegaFlops_Async) — это сокращение «Группа методов» для Task.Run(() => TW.DoingMegaFlops_Async()) — это разрешено, потому что вы вызываете метод без параметров.

Однако при вызове метода с параметрами вы должны включить его:

Task.Run(() => TW.DoingMegaFlops_Async(wtokenSource.Token), wtokenSource.Token);
person stuartd    schedule 13.10.2016
comment
Отлично, это действительно строит нормально. Это даже позволяет добавлять возвращаемое значение. Я удивлен, узнав, что использовал стенографию. Не проще ли было бы избежать лямбда-обозначения и исправить мое обозначение? Обозначение ()=› мне кажется, я начинал с Фортрана, что-то вроде высшей математики. - person Roland; 13.10.2016