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