2017-07-28 4 views
-1

私が持っている:タスクタイプの新しいタスクを作成するには?

async Task doWork() { Console.WriteLine("do some async work in this method"); } 

Task task = new Task(doWork); //line X 
task.Start(); 
task.Wait(); 

ラインXは、コンパイルエラーを与える:

CS0407 'Task Form1.doWork()' has the wrong return type

は、どのように私は新しいタスクdoWorkをインスタンス化していますか?

私は以下を使用することができますが、それは私に別の問題のセットを与えます。

Task task = doWork(); 
task.Wait(); 

この2番目の方法は避けたいです。というタイプの新しいTaskをX行でインスタンス化するにはどうすればよいですか?

+0

'Task task = doWork();'しかし、タスク内では、関数内で 'await'を使用しないので同期します – Gusman

+0

あなたは明らかにhttps://msdn.microsoft.com/en-us/libraryを見ました。 /dd321321(v=vs.110).aspxどのようなタイプが必要かを知るために - あなたが問題を抱えていることはいくらかわかりません...このコードで実際に何を達成したいのか説明できますか? –

+0

@Gusman、はい、 'doWork'の中に' await'というものがありますが、空のタスクにはまだ適用されるべきではありませんか?問題を解決しないように実際のコードを削除しました。 –

答えて

0

doWork()はTaskの戻り値の型を持っているので、宣言は、一般的なTask<TResult>のインスタンスにする必要がある - この場合、すなわちTask<Task>

+0

はい! 'タスクタスク=新しいタスク(doWork)' –

2

、何あなたはおそらくしたいことは、戻り値の型を持っているdoWorkを定義することですvoidです。次に、の初期化は、引数Actionsee docs)を使用してTaskコンストラクタを使用して示したとおりに行うことができます。

また、あなたが

Task task = doWork(); 

を使用することができますは二つの技術の間のトレードオフの議論のためのhereを参照してください。

+0

ありがとうございました。 'doWork'のための' Task'の型が必要な場合、 'newTest'コンストラクタ文でそれをどのようにインスタンス化すべきですか? –

+0

@OldGeezerなぜ 'Task'コンストラクタを使う必要がありますか? – yinnonsanders

+0

学術的な理解のため。非同期タスクから非同期タスクを呼び出す方法と、呼び出されたタスクが完全に完了した後にのみ呼び出し元に戻る方法を見つけようとしていました。 –

関連する問題