Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在第一个任务之后运行另一个任务_C#_.net_Task - Fatal编程技术网

C# 在第一个任务之后运行另一个任务

C# 在第一个任务之后运行另一个任务,c#,.net,task,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

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

虽然不推荐。您可以在
runAfter

if (runAfter!=null)
   runAfter.Start();
至于为什么不推荐,我建议这样做

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

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

await TaskSyncWithRemote("mySubfolder",runAfter);
但是,更好的方法是重构您的方法
tasksynchwithremote
,只执行其工作,并通过nice TPL api将继续任务的触发留给TaskScheduler,例如:

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

您正试图将任务对象传递给Task.Run()方法,但编译器告诉您不能:)编译器是个聪明人,您应该听他的。例如,您可以将操作传递给Task.Run()。但是,我认为您对ContinueWith()方法更感兴趣

//现在我想跑“追跑”

输入此方法时,
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
,并在此时调用它:

static async Task TaskSyncWithRemote(string subFolder, Func<Task> runAfter)
{
  ... // Code executed before `runAfter` starts.
  await runAfter();
  ... // Code executed after `runAfter` is done.
}
静态异步任务TaskSyncWithRemote(字符串子文件夹,Func runAfter)
{
…//在“runAfter”启动之前执行的代码。
等待runAfter();
…//在“runAfter”完成后执行的代码。
}

Task.Run()需要一个操作委托作为参数。您正在向它传递一个Task类型的对象,因此出现了您读取的错误。你能把runAfter的代码发出来吗?我认为你可以重构你的代码来达到你的最终目标,你应该陈述你的问题是什么。我们可以算出来,但你在这里只做了陈述。您没有问我们任何问题。请(1)不要建议不推荐的内容,(2)不要链接到外部网站,以及(3)您应该尝试回答所问的问题。@Enigmativity我确实回答了问题,建议了一个有效的解决方案。并警告了不利因素。我见过的最糟糕的否决票和评论@神秘性,从什么时候开始有禁止外部网站的规定?!更糟糕的是,你想让我回答这个问题,但在你的评论中,你无法理解这个问题是什么!对不起,关于外部链接我应该更清楚。鼓励外部链接,但仅支持您答案中已有的内容-如果链接断开,则答案在没有链接的情况下就足够了。你应该把链接站点的要点纳入你的答案中。这个问题是可以推断出来的,但是如果OP明确地问这个问题,这将有助于提高站点的质量。你还没有解释调用
.Start()
如何允许OP在第一个任务之后运行第二个任务。如果你能展示一些代码来解释OP如何使用
,那就太棒了。在他的特定示例中,继续使用
。如果他只是使用构造函数创建任务,它不会已经在进行中了then@SirajMansour当前位置由于没有很好的理由这样做,我认为op没有。