第一个任务后运行另一个任务

时间:2016-10-31 05:08:25

标签: c# .net task

我有一个像这样的简单方法,但我不能按如下方式运行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);
}

3 个答案:

答案 0 :(得分:2)

您正在尝试将Task对象传递给Task.Run()方法,但编译器告诉您不能:)编译器是一个聪明的人,您应该听他说。您可以将Action传递给Task.Run()。但是,我认为你对ContinueWith()方法

更感兴趣

答案 1 :(得分: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.
}

答案 2 :(得分:-1)

虽然不推荐。您可以在.Start()

上致电runAfter
if (runAfter!=null)
   runAfter.Start();

至于为何不推荐,我建议read

通过提供有关您的问题的详细程度和上下文,我只能假设您正在执行以下操作:

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

await TaskSyncWithRemote("mySubfolder",runAfter);
然而,更好的方法是重构你的方法TaskSyncWithRemote才能完成它的工作,并通过漂亮的TPL api向TaskScheduler触发一个延续任务,如:

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