我有一个从接口实现的方法,如下所示..
public Task CreateAsync(ApplicationUser user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
Task.Factory.StartNew(() => { Console.WriteLine("Hello Task library!"); });
//I even tried
//Task.Run(() => { Console.WriteLine("Hello Task library!"); });
}
上面的代码给了我一个错误,并非所有代码路径都返回值。
需要一个
return
:
return Task.Factory.StartNew(() => { Console.WriteLine("Hello Task library!"); });
或者更好:
return Task.Run(() => { Console.WriteLine("Hello Task library!"); });
返回
Task.CompletedTask
更干净。
public Task CreateAsync(ApplicationUser user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
Task.Factory.StartNew(() => { Console.WriteLine("Hello Task library!"); });
// other operations
return Task.CompletedTask;
}
方法名称中的参数
Task
表示该方法的返回值。
因此,编译器期望您的方法在某个时刻有一个
return
语句,您可以在其中返回名称中表示的类型的对象。
public Task CreateAsync(ApplicationUser user)
{
if (user == null)
{
// this part of code will return from the method with an exception
throw new ArgumentNullException("user");
}
// but this part of code is also expected to return something
return Task.Run(() => { Console.WriteLine("Hello Task library!"); });
}
这是因为您正在使用同步任务功能。
对于异步,您不需要返回任何内容。
async
关键字转换方法并构造返回的 Task 实例。 在这里阅读:
例如, 在这种情况下,您可以在 ID 列表上异步运行多个任务。这是通过将每个任务添加到任务列表中然后释放它们以并发运行来完成的:
private static List<Task> tasks = new();
public static async Task DoTask(int id)
{
// do something with id
}
public async Task RunTasks()
{
try
{
foreach(var id in IDList)
{
var result = DoTask(id);
if (result != null)
{
tasks.Add(result);
}
else
{
// null task
}
}
await tasks.WhenAll(tasks);
}
catch (Exception exc)
{
//Exception
}
}
WhenAll()
即使出现故障,也会等待所有任务完成。
需要一个返回..如果可能的话,一个在if条件内,一个在外部
需要一个返回..如果可能的话,一个也在if条件内,另一个在外部