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;
}

関数に 1 つ以上のパラメーターを渡したい場合は、ラムダを使用して関数を開始します。

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

于 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 に答える