非同期メソッドを実行するタスクを作成しようとしていますが、await
Action
パラメータがタスクのコンストラクタに含まれていないか、Task.Factory.StartNew
のパラメータに問題があります。非同期メソッドを実行するタスクを開始するC#
私のタスクをどのようにインスタンス化するかによって、私は異なる問題があります。私は7つの例を提供しました。
コード例:(タスク作成の7例)
private ConcurrentDictionary<int, Task> Tasks { get; set; }
private bool active = true;
private async Task StartTasks()
{
int numTasks = 5;
for(int i = 0; i < numTasks; i++)
{
//Task status is almost instantly "RanTocompletion" while work is still being done
Task task = new Task<Task>(DoWork, "someinfo", TaskCreationOptions.LongRunning);
task.Start();
//Cannot await method group
Task task = new Task(await DoWork, "someinfo", TaskCreationOptions.LongRunning);
task.Start();
//Task status is almost instantly "RanTocompletion" while work is still being done
Task task = new Task(async (object state) => await DoWork(state), "someinfo", TaskCreationOptions.LongRunning);
task.Start();
//Throws a "Start may not be called on a promise-style task." Exception
Task task = new Task<Task>(DoWork, "someinfo", TaskCreationOptions.LongRunning).Unwrap();
task.Start();
//Task starts doing work after Start() is called, then throws a "Start may not be called on a promise-style task." Exception
Task task = new Task(DoWork, "someinfo", TaskCreationOptions.LongRunning);
task.Start();
//Task starts doing work, but status is "WaitingForActivation
Task task = Task.Factory.StartNew(DoWork, "someinfo", TaskCreationOptions.LongRunning);
//Throws a "Start may not be called on a promise-style task." Exception
Task task = Task.Factory.StartNew(DoWork, "someinfo", TaskCreationOptions.LongRunning).Unwrap();
//For checking up on tasks as work is done
Tasks.TryAdd(task.Id, Task);
}
}
private async Task DoWork(object state)
{
while (active)
{
await MakeHttpRequest();
await DoSomethingCpuBound();
//..etc
}
//do any cleanup and return
}
ことがTaskCreationOptions
を提供していないので、私はTask.Run()
を使用することはできません。これらのタスクは、日常的に実行されます。
非同期アクションを待つタスクを開始するにはどうすればよいですか?
これはX-Yの問題のようです。あなたはXを解こうとしていて、Yは答えだと思っていますが、あなたはYのやり方を知らないので、あなたはそれについて尋ねています。代わりにXについて質問するほうがよいでしょう。あなたは私たちにXが何であるかを示すべきです。 – Enigmativity
最後の手段として、 'Task.Factory.StartNew'の同期匿名デリゲートを作成し、' .GetAwaiter()。GetResult() 'を介して待つことができます。 – zerkms
@Enigmativity私は掻いているウェブサイトからページをダウンロードするのに 'HttpClient'を使っています。長い遅延があるので、より多くのページを並列に引き出すことができます。これは機能しますが、タスクのステータスを確認できます。この非同期スレッドを実行すると、 'HttpClient'を待つ間にブロックされます。私はそれを解決しようとしています –