如何在任务完成时返回数据

时间:2012-10-29 12:30:27

标签: c# .net

我开始这样的任务

Task.Factory.StartNew(SomeMethod, TaskCreationOptions.LongRunning);

void SomeMethod()
{

}

任务完成后是否有办法返回数据?

喜欢

List<User> SomeMethod()
{
  List<User> = List<User>();
   ...
   return userList;
}

谢谢!

3 个答案:

答案 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);
}