我开始这样的任务
Task.Factory.StartNew(SomeMethod, TaskCreationOptions.LongRunning);
void SomeMethod()
{
}
有没有办法在任务完成时返回数据?
像
List<User> SomeMethod()
{
List<User> = List<User>();
...
return userList;
}
是的,像这样。通过使用Task.Factory.StartNew<TResult>(Func<TResult> function)
任务的泛型重载来定义返回类型。然后,task.Result
您可以访问您的结果。
Task<List<User>> task = Task.Factory.StartNew<List<User>>(SomeMethod, TaskCreationOptions.LongRunning);
RunSomeOtherMethod(); // We can do other work in parallel...
List<User> result = task.Result; // Wait for task to finish and fetch result.
List<User> SomeMethod()
{
List<User> = List<User>();
...
return userList;
}
如果您想将一个或多个参数传递给您的函数,请使用 lambda 来启动您的函数:
Task<List<User>> task = Task.Factory.StartNew<List<User>>(
() => SomeMethod("inputString"), //Starting the method using a lambda so you can pass in a parameter.
TaskCreationOptions.LongRunning
);
RunSomeOtherMethod(); // We can do other work in parallel...
List<User> result = task.Result; // Wait for task to finish and fetch result.
List<User> SomeMethod(string input)
{
List<User> = List<User>();
...
return userList;
}
有关线程和任务并行性的更多信息,请参阅在线电子书:Joseph Albahari 的 C# 中的线程
您必须使用Task<TResult>
而不是Task
.
List<User> SomeMethod()
{
List<User> = List<User>();
...
return userList;
}
var task = Task<List<User>>.Factory.StartNew(SomeMethod, TaskCreationOptions.LongRunning);
然后你可以通过调用 task.Result 得到结果
此外,您可以使用将在结果可用后调用的延续任务。
在 C# v7 中,Hamlet Hakobyan 和 SynerCoder 提供的语法并不是绝对必要的,因为 .StartNew() 的返回值是根据 SomeMethod 参数自动推断的。
List<User> SomeMethod()
{
List<User> userList = new List<User>();
return userList;
}
async Task DoWork()
{
List<User> users = await Task.Factory.StartNew(SomeMethod, TaskCreationOptions.LongRunning);
}