0

我开始这样的任务

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

void SomeMethod()
{

}

有没有办法在任务完成时返回数据?

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

3 回答 3

12

是的,像这样。通过使用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# 中的线程

于 2012-10-29T12:33:29.490 回答
2

您必须使用Task<TResult>而不是Task.

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

var task = Task<List<User>>.Factory.StartNew(SomeMethod, TaskCreationOptions.LongRunning);

然后你可以通过调用 task.Result 得到结果

此外,您可以使用将在结果可用后调用的延续任务。

于 2012-10-29T12:34:03.700 回答
2

在 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);
} 
于 2019-06-24T17:40:12.013 回答