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

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

4
タスクコンストラクターのキャンセルトークン:なぜですか?
特定のSystem.Threading.Tasks.TaskコンストラクターCancellationTokenはパラメーターとしてを受け取ります。 CancellationTokenSource source = new CancellationTokenSource(); Task t = new Task (/* method */, source.Token); これについて私を困惑させるのは、メソッド本体の内部から、渡されたトークンを実際に取得する方法がないということです(たとえば、のようなものはありませんTask.CurrentTask.CancellationToken)。トークンは、状態オブジェクトなどの他のメカニズムを通じて提供されるか、ラムダにキャプチャされる必要があります。 それでは、コンストラクタでキャンセルトークンを提供することにはどのような目的がありますか?

6
Task.Start / WaitとAsync / Awaitの違いは何ですか?
私は何かが足りないかもしれませんが、行うことの違いは何ですか: public void MyMethod() { Task t = Task.Factory.StartNew(DoSomethingThatTakesTime); t.Wait(); UpdateLabelToSayItsComplete(); } public async void MyMethod() { var result = Task.Factory.StartNew(DoSomethingThatTakesTime); await result; UpdateLabelToSayItsComplete(); } private void DoSomethingThatTakesTime() { Thread.Sleep(10000); }

11
TaskCompletionSource <T>はいつ使用する必要がありますか?
私の知る限り、知っているのは、ある時点で、そのSetResultまたはSetExceptionメソッドが呼び出さTask&lt;T&gt;れて、そのTaskプロパティを介して公開を完了することです。 言い換えれば、それはa Task&lt;TResult&gt;とその完成のプロデューサーとして機能します。 私はここに例を見ました: Funcを非同期で実行する方法が必要で、その操作を表すタスクがある場合。 public static Task&lt;T&gt; RunAsync&lt;T&gt;(Func&lt;T&gt; function) { if (function == null) throw new ArgumentNullException(“function”); var tcs = new TaskCompletionSource&lt;T&gt;(); ThreadPool.QueueUserWorkItem(_ =&gt; { try { T result = function(); tcs.SetResult(result); } catch(Exception exc) { tcs.SetException(exc); } }); return tcs.Task; } 私は持っていなかった場合はどちらが*を使用することができTask.Factory.StartNew-しかし、私はない持っていますTask.Factory.StartNew。 質問: 誰かが例で関連するシナリオを説明してくださいすることができ、直接にTaskCompletionSource にしていない仮想的な私が持っていないしている状況を Task.Factory.StartNew?

11
.Net 4.0にConcurrentList <T>はありませんか?
System.Collections.Concurrent.Net 4.0の新しい名前空間を見て、とても嬉しく思いました。私が見てきたConcurrentDictionary、ConcurrentQueue、ConcurrentStack、ConcurrentBagおよびBlockingCollection。 不思議なことに欠けているように見えるのは、ConcurrentList&lt;T&gt;です。私はそれを自分で書く必要がありますか(またはWebから取得する必要がありますか?)) ここに明らかなものがないのですか?


3
avs vs Task.Wait-Deadlock?
私はかなりの違いを理解していないTask.Waitとしますawait。 ASP.NET WebAPIサービスには、次のような機能があります。 public class TestController : ApiController { public static async Task&lt;string&gt; Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task&lt;string&gt; Bar() { return await Foo(); } public async static Task&lt;string&gt; Ros() { return await Bar(); } // GET api/test public IEnumerable&lt;string&gt; Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x =&gt; …

6
HttpClient-タスクはキャンセルされましたか?
1つまたは2つのタスクがある場合は正常に動作しますが、複数のタスクがリストされている場合は、「タスクがキャンセルされました」というエラーがスローされます。 List&lt;Task&gt; allTasks = new List&lt;Task&gt;(); allTasks.Add(....); allTasks.Add(....); Task.WaitAll(allTasks.ToArray(), configuration.CancellationToken); private static Task&lt;T&gt; HttpClientSendAsync&lt;T&gt;(string url, object data, HttpMethod method, string contentType, CancellationToken token) { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, url); HttpClient httpClient = new HttpClient(); httpClient.Timeout = new TimeSpan(Constants.TimeOut); if (data != null) { byte[] byteArray = Encoding.ASCII.GetBytes(Helper.ToJSON(data)); MemoryStream memoryStream …

7
Task.Run()とTask.Factory.StartNew()の違いは何ですか
私には方法があります: private static void Method() { Console.WriteLine("Method() started"); for (var i = 0; i &lt; 20; i++) { Console.WriteLine("Method() Counter = " + i); Thread.Sleep(500); } Console.WriteLine("Method() finished"); } そして、このメソッドを新しいタスクで開始したいと思います。このような新しいタスクを開始できます var task = Task.Factory.StartNew(new Action(Method)); またはこれ var task = Task.Run(new Action(Method)); しかし、間に何らかの違いがあるTask.Run()とはTask.Factory.StartNew()。どちらもThreadPoolを使用しており、タスクのインスタンスを作成した直後にMethod()を開始します。最初のバリアントをいつ使用し、いつ2番目に使用するか?

6
C#でのTask.FromResult <TResult>の用途は何ですか
C#およびTPL(Task Parallel Library)では、TaskクラスはT型の値を生成する進行中の作業を表します。 Task.FromResultメソッドの必要性は何ですか? つまり、すでに生成された値を手元に持っているシナリオで、それをタスクにラップする必要性は何ですか? 頭に浮かぶのは、Taskインスタンスを受け入れる他のメソッドのアダプターとして使用されることだけです。

9
Parallel.ForEachでの入れ子の待機
Metroアプリでは、いくつかのWCF呼び出しを実行する必要があります。実行される呼び出しの数は非常に多いので、並列ループで実行する必要があります。問題は、WCF呼び出しがすべて完了する前に並列ループが終了することです。 これをどのようにリファクタリングして期待どおりに機能させることができますか? var ids = new List&lt;string&gt;() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; var customers = new System.Collections.Concurrent.BlockingCollection&lt;Customer&gt;(); Parallel.ForEach(ids, async i =&gt; { ICustomerRepo repo = new CustomerRepo(); var cust = await repo.GetCustomer(i); customers.Add(cust); }); foreach ( var customer in customers ) { Console.WriteLine(customer.ID); …

4
待機中のタスクをキャンセルする方法は?
私はこれらのWindows 8 WinRTタスクで遊んでいて、以下の方法を使用してタスクをキャンセルしようとしていますが、それはある時点で機能します。CancelNotificationメソッドが呼び出されると、タスクがキャンセルされたように見えますが、バックグラウンドでタスクは実行を続け、その後、タスクが完了すると、タスクのステータスは常に完了し、キャンセルされることはありません。キャンセルされたときにタスクを完全に停止する方法はありますか? private async void TryTask() { CancellationTokenSource source = new CancellationTokenSource(); source.Token.Register(CancelNotification); source.CancelAfter(TimeSpan.FromSeconds(1)); var task = Task&lt;int&gt;.Factory.StartNew(() =&gt; slowFunc(1, 2), source.Token); await task; if (task.IsCompleted) { MessageDialog md = new MessageDialog(task.Result.ToString()); await md.ShowAsync(); } else { MessageDialog md = new MessageDialog("Uncompleted"); await md.ShowAsync(); } } private int slowFunc(int …

7
いつCancellationTokenSourceを破棄するのですか?
クラスCancellationTokenSourceは使い捨てです。Reflectorをざっと見てみるKernelEventと、(ほとんどの場合)管理されていないリソースの使用がわかります。にCancellationTokenSourceはファイナライザがないため、破棄しない場合、GCはそれを行いません。 一方、MSDNの記事「マネージスレッドでのキャンセル」に記載されているサンプルを見ると、トークンを破棄するコードスニペットは1つだけです。 コードでそれを処分する適切な方法は何ですか? using待機しないと、並列タスクを開始するコードをラップできません。そして、あなたが待たない場合にのみキャンセルをすることは理にかなっています。 もちろんContinueWith、Dispose電話でタスクを追加することもできますが、その方法ですか? 同期されずに最後に何かを行うキャンセル可能なPLINQクエリについてはどうですか?言いましょう.ForAll(x =&gt; Console.Write(x))か? 再利用できますか?同じトークンを複数の呼び出しに使用してから、ホストコンポーネントと一緒に破棄できますか(UIコントロールなど)。 ResetクリーンアップIsCancelRequestedとTokenフィールド化のメソッドのようなものがないため、再利用できないと思います。したがって、タスク(またはPLINQクエリ)を開始するたびに、新しいタスクを作成する必要があります。本当ですか?はいの場合、私の質問はDispose、それらの多くのCancellationTokenSourceインスタンスに対処するための正しい推奨される戦略は何ですか?

4
非同期/待機とBackgroundWorker
過去数日間、.net 4.5とc#5の新機能をテストしました。 新しい非同期/待機機能が気に入っています。以前、BackgroundWorkerを使用して、応答性の高いUIでバックグラウンドでより長いプロセスを処理していました。 私の質問は次のとおりです。これらの素晴らしい新機能を使用した後、いつasync / awaitを使用する必要があり、いつBackgroundWorkerを使用しますか?両方に共通するシナリオはどれですか?

2
Task.Start()、Task.Run()、Task.Factory.StartNew()の使用について
同じ仕事をするTPLの使用に関する3つのルーチンを見たところです。ここにコードがあります: public static void Main() { Thread.CurrentThread.Name = "Main"; // Create a task and supply a user delegate by using a lambda expression. Task taskA = new Task( () =&gt; Console.WriteLine("Hello from taskA.")); // Start the task. taskA.Start(); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", …

5
非同期ラムダを使用した並列foreach
コレクションを並行して処理したいのですが、実装に問題があるので、助けが必要です。 並列ループのラムダ内で、C#でasyncとマークされたメソッドを呼び出す場合に問題が発生します。例えば: var bag = new ConcurrentBag&lt;object&gt;(); Parallel.ForEach(myCollection, async item =&gt; { // some pre stuff var response = await GetData(item); bag.Add(response); // some post stuff } var count = bag.Count; 作成されたすべてのスレッドは事実上単なるバックグラウンドスレッドであり、Parallel.ForEach呼び出しは完了を待機しないため、問題はカウントが0で発生します。asyncキーワードを削除すると、メソッドは次のようになります。 var bag = new ConcurrentBag&lt;object&gt;(); Parallel.ForEach(myCollection, item =&gt; { // some pre stuff var responseTask = await GetData(item); …

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