我开始这样的任务
Task.Factory.StartNew(SomeMethod, TaskCreationOptions.LongRunning);
void SomeMethod()
{
}
任务完成后是否有办法返回数据?
喜欢
List<User> SomeMethod()
{
List<User> = List<User>();
...
return userList;
}
谢谢!
答案 0 :(得分:10)
是这样的。
通过使用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;
}
有关线程和任务并行的更多信息,我想向您推荐在线电子书:Threading in C# by Joseph Albahari
答案 1 :(得分:1)
您必须使用Task<TResult>
代替Task
。
List<User> SomeMethod()
{
List<User> = List<User>();
...
return userList;
}
var task = Task<List<User>>.Factory.StartNew(SomeMethod, TaskCreationOptions.LongRunning);
然后你可以通过调用task.Result
来获得结果此外,您可以使用继续任务,该任务将在结果可用后调用。
答案 2 :(得分:1)
在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);
}