タグ付けされた質問 「task-parallel-library」

Task Parallel Libraryは、.NET 4以降、.NET Frameworkの一部です。これは、開発者が非同期アプリケーションをプログラミングできるようにするAPIのセットです。

5
CancellationTokenがCancellationTokenSourceと分離しているのはなぜですか?
クラスCancellationTokenに加えて.NET 構造体が導入された理由の根拠を探していますCancellationTokenSource。APIの使用方法は理解していますが、そのように設計されている理由も理解したいと思います。 すなわち、なぜ私たちは持っているのですか? var cts = new CancellationTokenSource(); SomeCancellableOperation(cts.Token); ... public void SomeCancellableOperation(CancellationToken token) { ... token.ThrowIfCancellationRequested(); ... } 次のように直接渡す代わりにCancellationTokenSource: var cts = new CancellationTokenSource(); SomeCancellableOperation(cts); ... public void SomeCancellableOperation(CancellationTokenSource cts) { ... cts.ThrowIfCancellationRequested(); ... } これは、トークンを渡すよりもキャンセル状態のチェックが頻繁に行われるという事実に基づくパフォーマンス最適化ですか? それで、CancellationTokenSourceを追跡して更新できCancellationTokens、各トークンのキャンセルチェックはローカルフィールドアクセスですか? どちらの場合も、ロックされていない揮発性のブールで十分であることを考えると、なぜそれが速いのかはまだわかりません。 ありがとう!

4
voidを返すこととタスクを返すことの違いは何ですか?
さまざまなC#非同期CTPサンプルを見るvoidと、を返す非同期関数と、非ジェネリックを返す関数がありTaskます。Task<MyType>非同期操作が完了したときに呼び出し元にデータを返すのにa を返すと便利な理由がわかりますが、これまでに見た関数の戻り値の型にTaskは、データを返さないものがあります。なぜ戻りませんvoidか?

5
複数の待機よりも単一の「待機Task.WhenAll」を優先する必要があるのはなぜですか?
タスク完了の順序を気にせず、すべて完了する必要がある場合でもawait Task.WhenAll、複数の代わりに使用する必要がありますawaitか?たとえば、DoWork2以下の方法が推奨されますDoWork1(そしてその理由は?): using System; using System.Threading.Tasks; namespace ConsoleApp { class Program { static async Task<string> DoTaskAsync(string name, int timeout) { var start = DateTime.Now; Console.WriteLine("Enter {0}, {1}", name, timeout); await Task.Delay(timeout); Console.WriteLine("Exit {0}, {1}", name, (DateTime.Now - start).TotalMilliseconds); return name; } static async Task DoWork1() { var t1 = DoTaskAsync("t1.1", …

5
完了したタスクを作成する<T>
私はメソッドTask&lt;Result&gt; StartSomeTask()を実装していて、メソッドが呼び出される前にたまたま結果を知っています。すでに完了したTask &lt;T&gt;を作成するにはどうすればよいですか? これは私が現在やっていることです: private readonly Result theResult = new Result(); public override Task&lt;Result&gt; StartSomeTask() { var task = new Task&lt;Result&gt;(() =&gt; theResult); task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread); return task; } より良い解決策はありますか?

3
TPL TaskオブジェクトでDispose()を呼び出さないことは許容できると考えられますか?
バックグラウンドスレッドで実行するタスクをトリガーしたい。タスクの完了を待ちたくありません。 .net 3.5では、私はこれをしたでしょう: ThreadPool.QueueUserWorkItem(d =&gt; { DoSomething(); }); .net 4では、TPLが推奨される方法です。私が推奨する共通のパターンは次のとおりです。 Task.Factory.StartNew(() =&gt; { DoSomething(); }); ただし、StartNew()メソッドはTaskを実装するオブジェクトを返しますIDisposable。これは、このパターンを推奨する人々から見落とされているようです。Task.Dispose()メソッドに関するMSDNのドキュメントは言う: 「タスクへの最後の参照を解放する前に、必ずDisposeを呼び出してください。」 タスクが完了するまでタスクのdisposeを呼び出すことはできないため、メインスレッドを待機させてdisposeを呼び出すと、そもそもバックグラウンドスレッドで実行するポイントが無効になります。また、クリーンアップに使用できる完了/終了したイベントはないようです。 TaskクラスのMSDNページはこれについてコメントしておらず、 "Pro C#2010 ..."という本でも同じパターンを推奨しており、タスクの破棄についてはコメントしていません。 私がそのままにしておくとファイナライザーが最後にそれをキャッチしますが、これが戻ってきて、このような多くの火事をしていてファイナライザースレッドが圧倒されると、私に噛み付くのでしょうか? だから私の質問は: この場合Dispose()、Taskクラスを呼び出さなくても問題ありませんか?もしそうなら、なぜそしてリスク/結果はありますか? これについて説明しているドキュメントはありますか? それともTask私が見逃したオブジェクトを処分する適切な方法はありますか? または、TPLを使用してタスクを実行して忘れる別の方法はありますか?

2
Parallel.ForEachが完了するまで待機するにはどうすればよいですか?
現在のプロジェクトではTPLを使用しており、Parallel.Foreachを使用して多くのスレッドをスピンしています。Taskクラスには、タスクが完了するまで待機するWait()が含まれています。そのように、Parallel.ForEachが完了するのを待ってから、次のステートメントを実行する方法を教えてください。

3
MVC5で非同期を使用する利点は何ですか?
違いは何ですか: public ActionResult Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe); if (result.Success) { return Redirect("~/home"); } else { AddErrors(result); } } return View(model); } そして: [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task&lt;ActionResult&gt; Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { IdentityResult result = …

7
ブラウザーがリクエストをキャンセルしたときのASP.NET Web API OperationCanceledException
ユーザーがページを読み込むと、ASP.NET Web API 2コントローラーにヒットする1つまたは複数のajax要求が行われます。ユーザーが別のページに移動した場合、これらのajaxリクエストが完了する前に、リクエストはブラウザーによってキャンセルされます。次に、ELMAH HttpModuleは、キャンセルされたリクエストごとに2つのエラーをログに記録します。 エラー1: System.Threading.Tasks.TaskCanceledException: A task was canceled. at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Controllers.ApiControllerActionInvoker.&lt;InvokeActionAsyncCore&gt;d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Controllers.ActionFilterResult.&lt;ExecuteAsync&gt;d__2.MoveNext() --- End of stack …

2
awaitとContinueWithの違い
場合誰かが説明できawaitそしてContinueWith次の例では同義かではありません。私は初めてTPLを使用しようとしていますが、すべてのドキュメントを読んでいますが、違いがわかりません。 待ってください: String webText = await getWebPage(uri); await parseData(webText); ContinueWith: Task&lt;String&gt; webText = new Task&lt;String&gt;(() =&gt; getWebPage(uri)); Task continue = webText.ContinueWith((task) =&gt; parseData(task.Result)); webText.Start(); continue.Wait(); 特定の状況では、どちらが優先されますか?

6
2つの非同期タスクを並行して実行し、.NET 4.5で結果を収集する
私はしばらくの間、.NET 4.5で簡単に操作できると思ったものを取得しようとしています 2つの実行時間の長いタスクを同時に起動 し、最良のC#4.5(RTM)で結果を収集したい 以下は動作しますが、私はそれが好きではありません: Sleep非同期メソッドになりたいので、await他のメソッドにできます それはちょうど不器用に見えます Task.Run() 新しい言語機能を使用しているとはまったく思いません! 作業コード: public static void Go() { Console.WriteLine("Starting"); var task1 = Task.Run(() =&gt; Sleep(5000)); var task2 = Task.Run(() =&gt; Sleep(3000)); int totalSlept = task1.Result + task2.Result; Console.WriteLine("Slept for a total of " + totalSlept + " ms"); } private static int Sleep(int …

13
同時非同期I / O操作の量を制限するにはどうすればよいですか?
// let's say there is a list of 1000+ URLs string[] urls = { "http://google.com", "http://yahoo.com", ... }; // now let's send HTTP requests to each of these URLs in parallel urls.AsParallel().ForAll(async (url) =&gt; { var client = new HttpClient(); var html = await client.GetStringAsync(url); }); これが問題です。1000以上の同時Webリクエストを開始します。これらの非同期HTTPリクエストの同時量を制限する簡単な方法はありますか?そのため、一度にダウンロードされるWebページは20を超えません。最も効率的な方法でそれを行う方法?

5
なぜこの非同期アクションがハングするのですか?
私はC#の新しい使用法呼び出すマルチティアの.Net 4.5アプリケーション持つasyncとawaitそのキーワードだけでハングアップし、私はなぜ見ることができません。 一番下には、データベースユーティリティを拡張する非同期メソッドがありますOurDBConn(基本的には、基になるオブジェクトDBConnectionとDBCommandオブジェクトのラッパー)。 public static async Task&lt;T&gt; ExecuteAsync&lt;T&gt;(this OurDBConn dataSource, Func&lt;OurDBConn, T&gt; function) { string connectionString = dataSource.ConnectionString; // Start the SQL and pass back to the caller until finished T result = await Task.Run( () =&gt; { // Copy the SQL connection so that we don't get two commands …

3
タスクの待機は、タスクで待機することも、Exceptionプロパティにアクセスすることもできませんでした。その結果、観察されなかった例外は
これは何を意味し、どのように解決しますか? TPLタスクを使用しています。 エラー全体 タスクの待機は、タスクで待機することも、Exceptionプロパティにアクセスすることもできませんでした。その結果、監視されていない例外がファイナライザスレッドによって再スローされました。 System.Threading.Tasks.TaskExceptionHolder.Finalize()で mscorlib


3
現在のSynchronizationContextはTaskSchedulerとして使用できません
Tasksを使用してViewModelで長時間実行されているサーバー呼び出しを実行していますが、結果はをDispatcher使用してマーシャリングされTaskScheduler.FromSyncronizationContext()ます。例えば: var context = TaskScheduler.FromCurrentSynchronizationContext(); this.Message = "Loading..."; Task task = Task.Factory.StartNew(() =&gt; { ... }) .ContinueWith(x =&gt; this.Message = "Completed" , context); アプリケーションを実行すると、これは正常に機能します。しかし、NUnitテストを実行すると、次Resharperのように呼び出すとエラーメッセージが表示されますFromCurrentSynchronizationContext。 現在のSynchronizationContextはTaskSchedulerとして使用できません。 これは、テストがワーカースレッドで実行されるためだと思います。テストがメインスレッドで実行されるようにするにはどうすればよいですか?その他の提案は大歓迎です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.