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

Task Parallel Library เป็นส่วนหนึ่งของ. NET Framework ตั้งแต่. NET 4 มันเป็นชุดของ API เพื่อให้นักพัฒนาสามารถเขียนโปรแกรมแอปพลิเคชันแบบอะซิงโครนัส

6
พารามิเตอร์ดีฟอลต์สำหรับ Can CancelToken
ฉันมีรหัส async บางอย่างที่ผมอยากจะเพิ่มCancellationTokenไป แต่มีการใช้งานจำนวนมากที่นี้ไม่จำเป็นต้องดังนั้นผมจึงอยากมีพารามิเตอร์เริ่มต้น - CancellationToken.Noneบางที อย่างไรก็ตาม Task<x> DoStuff(...., CancellationToken ct = null) ผลตอบแทน ไม่สามารถใช้ค่าประเภท '' เป็นพารามิเตอร์เริ่มต้นได้เนื่องจากไม่มีการแปลงมาตรฐานให้พิมพ์ 'System.Threading.CancellationToken' และ Task<x> DoStuff(...., CancellationToken ct = CancellationToken.None) ค่าพารามิเตอร์เริ่มต้นสำหรับ 'ct' ต้องเป็นค่าคงที่เวลาคอมไพล์ มีวิธีใดบ้างที่จะมีค่าเริ่มต้นสำหรับCancellationToken?

5
ตัวอย่าง async / await ที่ทำให้เกิดการชะงักงัน
ฉันพบแนวทางปฏิบัติที่ดีที่สุดสำหรับการเขียนโปรแกรมแบบอะซิงโครนัสโดยใช้ c # async/ awaitคำหลัก (ฉันเพิ่งเริ่มใช้ c # 5.0) หนึ่งในคำแนะนำที่ได้รับมีดังต่อไปนี้: ความเสถียร: รู้บริบทการซิงโครไนซ์ของคุณ ... บริบทการซิงโครไนซ์บางส่วนไม่ได้ reentrant และ single-threaded ซึ่งหมายความว่าสามารถทำงานได้เพียงหน่วยเดียวในบริบทในช่วงเวลาที่กำหนด ตัวอย่างนี้คือเธรด UI ของ Windows หรือบริบทการร้องขอ ASP.NET ในบริบทการซิงโครไนซ์แบบเธรดเดี่ยวเหล่านี้คุณสามารถหยุดชะงักได้โดยง่าย หากคุณวางภารกิจจากบริบทเธรดเดียวให้รองานนั้นในบริบทรหัสรอของคุณอาจบล็อกงานเบื้องหลัง public ActionResult ActionAsync() { // DEADLOCK: this blocks on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { …

3
จำเป็นต้องเข้าใจการใช้งานของ SemaphoreSlim
นี่คือรหัสที่ฉันมี แต่ฉันไม่เข้าใจว่าSemaphoreSlimกำลังทำอะไรอยู่ async Task WorkerMainAsync() { SemaphoreSlim ss = new SemaphoreSlim(10); List<Task> trackedTasks = new List<Task>(); while (DoMore()) { await ss.WaitAsync(); trackedTasks.Add(Task.Run(() => { DoPollingThenWorkAsync(); ss.Release(); })); } await Task.WhenAll(trackedTasks); } void DoPollingThenWorkAsync() { var msg = Poll(); if (msg != null) { Thread.Sleep(2000); // process the long running CPU-bound …

3
วิธีที่เหมาะสมในการดำเนินงานที่ไม่มีวันสิ้นสุด (ตัวจับเวลาเทียบกับงาน)
ดังนั้นแอปของฉันจำเป็นต้องดำเนินการเกือบจะต่อเนื่อง (โดยหยุดชั่วคราวประมาณ 10 วินาทีระหว่างการรันแต่ละครั้ง) ตราบเท่าที่แอปกำลังทำงานอยู่หรือมีการร้องขอการยกเลิก งานที่ต้องทำมีความเป็นไปได้ที่จะใช้เวลาถึง 30 วินาที จะดีกว่าไหมหากใช้ System.Timers.Timer และใช้ AutoReset เพื่อให้แน่ใจว่าจะไม่ดำเนินการก่อนที่ "ติ๊ก" ก่อนหน้าจะเสร็จสิ้น หรือฉันควรใช้งานทั่วไปในโหมด LongRunning ที่มีโทเค็นการยกเลิกและมีปกติไม่มีที่สิ้นสุดในขณะที่วนซ้ำอยู่ภายในเรียกการดำเนินการที่ทำงานกับเธรด 10 วินาทีนอนหลับระหว่างการโทร? สำหรับโมเดล async / await ฉันไม่แน่ใจว่ามันจะเหมาะสมที่นี่เพราะฉันไม่มีค่าตอบแทนจากการทำงาน CancellationTokenSource wtoken; Task task; void StopWork() { wtoken.Cancel(); try { task.Wait(); } catch(AggregateException) { } } void StartWork() { wtoken = new CancellationTokenSource(); task = …

7
มีการแทนที่ตามงานสำหรับ System.Threading.Timer หรือไม่
ฉันเพิ่งเริ่มใช้ Tasks ของ. Net 4.0 และฉันไม่พบสิ่งที่คิดว่าจะเป็นการแทนที่งานตามงานหรือการใช้งานตัวจับเวลาเช่นงานตามระยะเวลา มีอย่างนั้นหรือ? อัปเดต สิ่งที่ฉันคิดว่าเป็นวิธีแก้ปัญหาตามความต้องการของฉันซึ่งก็คือการรวมฟังก์ชัน "Timer" ไว้ในงานที่มี Tasks ย่อยโดยใช้ประโยชน์จาก Can CancelToken และส่งคืนงานเพื่อให้สามารถเข้าร่วมในขั้นตอนงานต่อไปได้ public static Task StartPeriodicTask(Action action, int intervalInMilliseconds, int delayInMilliseconds, CancellationToken cancelToken) { Action wrapperAction = () => { if (cancelToken.IsCancellationRequested) { return; } action(); }; Action mainAction = () => { TaskCreationOptions attachedToParent = …

7
แนะนำให้ใช้ prevTask.Wait () กับ ContinueWith (จากไลบรารี Tasks) หรือไม่
เมื่อเร็ว ๆ นี้ฉันได้รับแจ้งว่าฉันใช้. ContinueWith for Tasks ของฉันอย่างไรไม่ใช่วิธีที่เหมาะสมในการใช้ ฉันยังไม่พบหลักฐานเกี่ยวกับเรื่องนี้บนอินเทอร์เน็ตดังนั้นฉันจะถามพวกคุณว่าคำตอบคืออะไร นี่คือตัวอย่างของวิธีที่ฉันใช้. ContinueWith: public Task DoSomething() { return Task.Factory.StartNew(() => { Console.WriteLine("Step 1"); }) .ContinueWith((prevTask) => { Console.WriteLine("Step 2"); }) .ContinueWith((prevTask) => { Console.WriteLine("Step 3"); }); } ตอนนี้ฉันรู้แล้วว่านี่เป็นตัวอย่างง่ายๆและมันจะทำงานเร็วมาก แต่แค่สมมติว่าแต่ละงานทำงานได้นานขึ้น ดังนั้นสิ่งที่ฉันได้รับแจ้งก็คือใน. ContinueWith คุณต้องพูดว่า prevTask.Wait (); มิฉะนั้นคุณสามารถทำงานก่อนที่งานก่อนหน้านี้จะเสร็จสิ้น เป็นไปได้หรือไม่? ฉันคิดว่างานที่สองและสามของฉันจะทำงานเมื่องานก่อนหน้านี้เสร็จสิ้นเท่านั้น สิ่งที่ฉันบอกวิธีเขียนโค้ด: public Task DoSomething() { return …

7
Task.Run ด้วยพารามิเตอร์?
Threading.Tasksผมทำงานในโครงการเครือข่ายแบบมัลติทาสกิ้และฉันใหม่ ฉันใช้งานง่ายTask.Factory.StartNew()และฉันสงสัยว่าจะทำได้Task.Run()อย่างไร? นี่คือรหัสพื้นฐาน: Task.Factory.StartNew(new Action<object>( (x) => { // Do something with 'x' }), rawData); ฉันตรวจสอบSystem.Threading.Tasks.TaskในObject Browserแล้วไม่พบAction<T>พารามิเตอร์ like มีเพียงActionที่ใช้voidพารามิเตอร์และไม่มีประเภท มีเพียง 2 สิ่งที่คล้ายกัน: static Task Run(Action action)และstatic Task Run(Func<Task> function)แต่ไม่สามารถโพสต์พารามิเตอร์ด้วยทั้งสองอย่าง ใช่ฉันรู้ว่าฉันสามารถสร้างวิธีการขยายแบบง่าย ๆ ได้ แต่คำถามหลักของฉันคือเราสามารถเขียนเป็นบรรทัดเดียวด้วยTask.Run()?

4
มีอะไรเช่น Asynchronous BlockingCollection <T> หรือไม่?
ฉันต้องการawaitผลลัพธ์ของBlockingCollection&lt;T&gt;.Take()แบบอะซิงโครนัสดังนั้นฉันจึงไม่บล็อกเธรด กำลังมองหาอะไรเช่นนี้: var item = await blockingCollection.TakeAsync(); ฉันรู้ว่าฉันทำได้: var item = await Task.Run(() =&gt; blockingCollection.Take()); แต่นั่นเป็นการฆ่าความคิดทั้งหมดเพราะเธรดอื่นThreadPoolถูกบล็อกแทน มีทางเลือกอื่นไหม

3
ทำไมต้องทำงานต่อเนื่องเมื่องานทั้งหมดถูกดำเนินการพร้อมกัน?
ฉันเพิ่งสังเกตข้อสงสัยเกี่ยวกับTask.WhenAllวิธีการเมื่อทำงานบน. NET Core 3.0 ฉันส่งTask.Delayงานง่าย ๆเป็นอาร์กิวเมนต์เดียวไปยังTask.WhenAllและฉันคาดว่างานที่ถูกห่อจะทำงานเหมือนกันกับงานต้นฉบับ แต่นี่ไม่ใช่กรณี ความต่อเนื่องของงานดั้งเดิมจะถูกดำเนินการแบบอะซิงโครนัส (ซึ่งเป็นที่ต้องการ) และความต่อเนื่องของหลาย ๆ ตัวTask.WhenAll(task)จะถูกดำเนินการแบบซิงโครนัสแบบหนึ่งหลังจากสิ่งอื่น ๆ นี่คือตัวอย่างของพฤติกรรมนี้ งานของผู้ปฏิบัติงานสี่คนกำลังรอTask.Delayงานเดียวกันให้เสร็จและดำเนินการคำนวณต่อไปอย่างหนัก (จำลองโดย a Thread.Sleep) var task = Task.Delay(500); var workers = Enumerable.Range(1, 4).Select(async x =&gt; { Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" + $" [{Thread.CurrentThread.ManagedThreadId}] Worker{x} before await"); await task; //await Task.WhenAll(task); Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" + $" [{Thread.CurrentThread.ManagedThreadId}] Worker{x} after await"); Thread.Sleep(1000); // …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.