คำถามติดแท็ก task-parallel-library

Task Parallel Library เป็นส่วนหนึ่งของ. NET Framework ตั้งแต่. NET 4 มันเป็นชุดของ 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>
AFAIK ทั้งหมดก็รู้ก็คือว่าในบางจุดของมันSetResultหรือSetExceptionวิธีการที่จะถูกเรียกตัวไปดำเนินการTask&lt;T&gt;สัมผัสผ่านTaskคุณสมบัติ กล่าวอีกนัยหนึ่งมันทำหน้าที่เป็นผู้อำนวยการสร้าง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ได้ …

11
ไม่มี ConcurrentList <T> ใน. Net 4.0?
ฉันตื่นเต้นที่ได้เห็นSystem.Collections.Concurrentnamespace ใหม่ใน. Net 4.0 ค่อนข้างดี! ผมเคยเห็นConcurrentDictionary, ConcurrentQueue, ConcurrentStack, และConcurrentBagBlockingCollection ConcurrentList&lt;T&gt;สิ่งหนึ่งที่น่าจะเป็นไปอย่างลึกลับหายไปเป็น ฉันต้องเขียนเอง (หรือเอามันออกจากเว็บ :))? ฉันขาดอะไรบางอย่างชัดเจนที่นี่?


3
รอคอย vs Task.Wait - Deadlock?
ฉันไม่เข้าใจความแตกต่างระหว่างและTask.Waitawait ฉันมีบางอย่างที่คล้ายกับฟังก์ชั่นต่อไปนี้ในบริการ 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 …

6
HttpClient - งานถูกยกเลิกหรือไม่
ทำงานได้ดีเมื่อมีงานหนึ่งหรือสองงาน แต่เกิดข้อผิดพลาด "งานถูกยกเลิก" เมื่อเรามีงานมากกว่าหนึ่งรายการ 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 = …

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 และเริ่มวิธีการ () ทันทีหลังจากสร้างอินสแตนซ์ของงาน …

6
การใช้งานสำหรับ Task.FromResult คืออะไร <TResult> ใน C #
ใน C # และ TPL ( Task Parallel Library ) Taskคลาสจะแสดงงานต่อเนื่องที่สร้างมูลค่าประเภท T ฉันต้องการที่จะรู้ว่าสิ่งที่จำเป็นสำหรับวิธีการTask.FromResult ? นั่นคือ: ในสถานการณ์ที่คุณมีมูลค่าที่ผลิตอยู่แล้วสิ่งที่จำเป็นต้องห่อกลับเข้าไปในงานคืออะไร? สิ่งเดียวที่อยู่ในใจคือมันถูกใช้เป็นอะแดปเตอร์สำหรับวิธีการอื่นที่ยอมรับอินสแตนซ์ของงาน

9
การทำรังกำลังรออยู่ใน Parallel.ForEach
ในแอพพลิเคชั่นรถไฟใต้ดินฉันต้องทำการเรียก 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 …

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"); …

7
เมื่อใดจึงจะยกเลิก CancellationTokenSource
ชั้นเรียนCancellationTokenSourceเป็นแบบใช้แล้วทิ้ง การดูอย่างรวดเร็วใน Reflector พิสูจน์การใช้งานKernelEventซึ่งเป็นทรัพยากรที่ไม่มีการจัดการ (มีโอกาสมาก) เนื่องจากCancellationTokenSourceไม่มี finalizer หากเราไม่ได้กำจัด GC จะไม่ทำเช่นนั้น ในทางกลับกันถ้าคุณดูตัวอย่างที่แสดงอยู่ในบทความ MSDN การยกเลิกในเธรดที่ได้รับการจัดการมีเพียงข้อมูลโค้ดเดียวเท่านั้นที่ใช้โทเค็น เป็นวิธีที่เหมาะสมในการกำจัดมันในรหัสอะไร คุณไม่สามารถตัดโค้ดเพื่อเริ่มงานคู่ขนานของคุณได้usingหากคุณไม่รอ และมันก็สมเหตุสมผลที่จะยกเลิกหากคุณไม่รอ แน่นอนว่าคุณสามารถเพิ่มContinueWithงานด้วยการDisposeโทร แต่นั่นเป็นวิธีที่จะไปไหม? แล้วแบบสอบถาม PLINQ ที่ยกเลิกได้ซึ่งไม่ซิงโครไนซ์ย้อนกลับ แต่ทำอะไรได้บ้างในตอนท้าย สมมติว่า.ForAll(x =&gt; Console.Write(x))อย่างไร มันสามารถใช้ซ้ำได้หรือไม่ สามารถใช้โทเค็นเดียวกันสำหรับการโทรหลายครั้งแล้วทิ้งพร้อมกับส่วนประกอบโฮสต์สมมติว่าการควบคุม UI ได้หรือไม่ เนื่องจากมันไม่มีResetวิธีการล้างข้อมูลIsCancelRequestedและTokenฟิลด์ฉันคิดว่ามันไม่สามารถใช้ซ้ำได้ดังนั้นทุกครั้งที่คุณเริ่มงาน (หรือแบบสอบถาม PLINQ) คุณควรสร้างใหม่ มันจริงหรอ? ถ้าใช่คำถามของฉันคือกลยุทธ์ที่ถูกต้องและแนะนำในการจัดการกับอินสแตนซ์Disposeเหล่านั้นCancellationTokenSourceคืออะไร?

4
Async / await vs BackgroundWorker
ในไม่กี่วันที่ผ่านมาฉันได้ทดสอบคุณสมบัติใหม่ของ. net 4.5 และ c # 5 ฉันชอบคุณสมบัติใหม่ของ async / await ก่อนหน้านี้ฉันใช้BackgroundWorkerเพื่อจัดการกระบวนการที่ยาวนานขึ้นในพื้นหลังด้วย UI ที่ตอบสนอง คำถามของฉันคือ: หลังจากมีคุณสมบัติใหม่ที่ดีเหล่านี้ฉันควรใช้ async / คอยและเมื่อเป็นBackgroundWorker ? สถานการณ์ทั่วไปสำหรับทั้งคู่คืออะไร

2
เกี่ยวกับการใช้งานของ Task.Start (), Task.Run () และ Task.Factory.StartNew ()
ฉันเพิ่งเห็น 3 กิจวัตรเกี่ยวกับการใช้ TPL ซึ่งทำงานเหมือนกัน นี่คือรหัส: 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 …

5
ด้านหน้าขนานกับแลมด้าแบบอะซิงโครนัส
ฉันต้องการจัดการคอลเลคชันควบคู่กันไป แต่ฉันประสบปัญหาในการใช้งานจึงหวังว่าจะได้รับความช่วยเหลือ ปัญหาเกิดขึ้นถ้าฉันต้องการเรียกวิธีการที่ทำเครื่องหมาย async ใน C # ภายในแลมบ์ดาของลูปขนาน ตัวอย่างเช่น: 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; ปัญหาเกิดขึ้นกับการนับเป็น 0 เนื่องจากเธรดทั้งหมดที่สร้างขึ้นมีประสิทธิภาพเป็นเพียงเธรดพื้นหลังและการParallel.ForEachโทรไม่รอให้เสร็จสิ้น หากฉันลบคีย์เวิร์ด async วิธีการจะมีลักษณะดังนี้: var bag = new ConcurrentBag&lt;object&gt;(); Parallel.ForEach(myCollection, …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.