2016-10-31 4 views
1

У меня есть простой метод, как это, но я не могу запустить runAfter следующим образом, но компилятор говорит:Запуск другой задачи после первой задачи

Ошибка CS1503 Аргумент 1: не удается преобразовать из «System.Threading.Tasks Хотя это не рекомендуется .Task»до '' System.Action

static async Task TaskSyncWithRemote(string subFolder, Task runAfter) 
{ 
    ... 
    some code run here 
    ... 
    // now I want to run "runAfter", but compiler doesn't like it :) 
    if (runAfter!=null) 
     Task.Run(runAfter); 
} 
+2

Task.Run() ожидает действий делегата в качестве параметра. вы передаете ему объект типа Task, следовательно, вы читаете ошибку. можете ли вы опубликовать код, из которого выполняется runAfter? я думаю, что вы можете реорганизовать свой код там, чтобы достичь своей конечной цели. –

+2

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

ответ

2

вы пытаетесь передать объект Task в Task.Run() метод, но компилятор говорит, вы не можете :) компилятор умный парень, вы должны l ему принадлежит. Вы можете передать, например, Action to Task.Run(). Тем не менее, я думаю, вы больше заинтересованы в ContinueWith() метод

+0

Было бы замечательно, если бы вы показали какой-то код, чтобы объяснить, как OP будет использовать '.ContinueWith' в своем конкретном примере. – Enigmativity

-1

. Вы можете позвонить .Start() на runAfter

if (runAfter!=null) 
    runAfter.Start(); 

как почему не рекомендуется, я предлагаю это read.

С уровнем детализации и контекст, обеспечиваемый о вашей проблеме, я могу только предположить, что вы делаете следующее:

Task runAfter = new Task(() => /* do something */); 

await TaskSyncWithRemote("mySubfolder",runAfter); 

однако лучшим подходом было бы реорганизовать ваш метод TaskSyncWithRemote делать только свою работу, и оставить запуская продолжение задачу к TaskScheduler через хороший TPL API, такие как:

await TaskSyncWithRemote("mySubfolder").ContinueWith(() => /* do something */); 
+0

Просьба (1) не предлагать что-то, что не рекомендуется, (2) не ссылаться на внешние сайты, и (3) вы должны попытаться ответить на заданный вопрос. – Enigmativity

+0

@ Энигматичность. Я ответила на вопрос, предложила правильное решение. И предупредил об обратном. Худший downvote и обзор я когда-либо видел! –

+0

@ Энигматичность и с тех пор, когда существует правило против внешних сайтов?! Хуже того, вы хотите, чтобы я ответил на вопрос, но в вашем комментарии вы не можете понять, в чем вопрос! –

1

// теперь я хочу, чтобы запустить «runAfter»

runAfter уже выполняется при входе в этот метод.

Вы можете (асинхронно) ждать его, чтобы полной, если вы хотите:

static async Task TaskSyncWithRemote(string subFolder, Task runAfter) 
{ 
    ... // Code executed while `runAfter` is in progress. 
    await runAfter; 
    ... // Code executed after `runAfter` is done. 
} 

Если вы имеете в виду вы не хотите runAfter к начала до этого момента, то вы должны изменить тип вашего параметра Func<Task> и вызвать его в то время:

static async Task TaskSyncWithRemote(string subFolder, Func<Task> runAfter) 
{ 
    ... // Code executed before `runAfter` starts. 
    await runAfter(); 
    ... // Code executed after `runAfter` is done. 
} 
+0

Что делать, если он только что создал задачу с помощью конструктора, он не будет уже выполнен, тогда –

+0

@SirajMansour: Поскольку для этого никогда не было веской причины, я предположил, что op не сделал этого. –