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

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

5
ทำไม Can CancelToken จึงแยกจาก Can CancelTokenSource
ฉันกำลังมองหาเหตุผลว่าทำไม. NET CancellationTokenstruct จึงถูกนำมาใช้นอกเหนือจาก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
อะไรคือความแตกต่างระหว่างการคืนค่าว่างเปล่าและการส่งคืนงาน?
ในการมองในหลาย ๆ ตัวอย่าง C # Async CTP ผมเห็นบาง async หน้าที่ว่าการกลับมาvoidและคนอื่น ๆ Taskที่ส่งกลับไม่ใช่ทั่วไป ฉันเห็นว่าเหตุใดการส่งคืน a Task<MyType>จึงมีประโยชน์ในการส่งคืนข้อมูลไปยังผู้โทรเมื่อการดำเนินการ async เสร็จสิ้น แต่ฟังก์ชันที่ฉันเห็นว่ามีประเภทการTaskส่งคืนไม่ส่งคืนข้อมูลใด ๆ ทำไมไม่กลับvoidล่ะ

5
เหตุใดฉันจึงควรเลือก 'await 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 …

5
สร้างงาน <T> ที่เสร็จสมบูรณ์
ฉันกำลังใช้วิธีการTask&lt;Result&gt; StartSomeTask()และบังเอิญรู้ผลลัพธ์อยู่แล้วก่อนที่เมธอดจะถูกเรียกใช้ ฉันจะสร้างงาน &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
ถือว่าเป็นที่ยอมรับหรือไม่ที่จะไม่เรียก Dispose () บนวัตถุ TPL Task
ฉันต้องการทริกเกอร์งานให้ทำงานบนเธรดพื้นหลัง ฉันไม่อยากรอให้งานเสร็จ ใน. net 3.5 ฉันจะทำสิ่งนี้: ThreadPool.QueueUserWorkItem(d =&gt; { DoSomething(); }); ใน. net 4 TPL เป็นวิธีที่แนะนำ รูปแบบทั่วไปที่ฉันเห็นแนะนำคือ: Task.Factory.StartNew(() =&gt; { DoSomething(); }); อย่างไรก็ตามStartNew()วิธีการส่งกลับวัตถุซึ่งการดำเนินการTask IDisposableดูเหมือนว่าคนที่แนะนำลายนี้จะมองข้ามไป เอกสาร MSDN เกี่ยวกับTask.Dispose()วิธีการกล่าวว่า: "โทรหา Dispose ทุกครั้งก่อนที่คุณจะปล่อยการอ้างอิงล่าสุดของคุณไปที่งาน" คุณไม่สามารถเรียกทิ้งในงานได้จนกว่าจะเสร็จสิ้นดังนั้นการรอเธรดหลักและเรียกใช้การกำจัดจะทำให้จุดที่ต้องทำบนเธรดพื้นหลังตั้งแต่แรก ดูเหมือนว่าจะไม่มีเหตุการณ์ที่เสร็จสมบูรณ์ / เสร็จสิ้นที่สามารถใช้ในการล้างข้อมูลได้ หน้า MSDN ในคลาสงานไม่แสดงความคิดเห็นเกี่ยวกับเรื่องนี้และหนังสือ "Pro C # 2010 ... " แนะนำรูปแบบเดียวกันและไม่แสดงความคิดเห็นเกี่ยวกับการกำจัดงาน ฉันรู้ว่าถ้าฉันปล่อยทิ้งไว้โปรแกรมสุดท้ายจะจับมันได้ในที่สุด แต่นี่จะกลับมากัดฉันเมื่อฉันทำงานหนักและลืมงานแบบนี้และเธรด Finalizer ท่วมท้นหรือไม่? ดังนั้นคำถามของฉันคือ: ก็เป็นที่ยอมรับที่จะไม่เรียกDispose()ในTaskระดับในกรณีนี้หรือไม่? …

2
ฉันจะรอจนกว่า ParallelForEach จะเสร็จสมบูรณ์ได้อย่างไร
ฉันใช้ TPL ในโปรเจ็กต์ปัจจุบันของฉันและใช้ Parallel.Foreach เพื่อหมุนเธรดจำนวนมาก คลาสงานประกอบด้วย Wait () เพื่อรอจนกว่างานจะเสร็จสมบูรณ์ เช่นนั้นฉันจะรอให้ ParallelForEach เสร็จสมบูรณ์แล้วไปเรียกใช้คำสั่งถัดไปได้อย่างไร

3
ข้อดีของการใช้ async กับ 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 เมื่อเบราว์เซอร์ยกเลิกการร้องขอ
เมื่อผู้ใช้โหลดเพจผู้ใช้จะทำการร้องขอ ajax อย่างน้อยหนึ่งรายการซึ่งเข้าสู่ตัวควบคุม ASP.NET Web API 2 หากผู้ใช้ไปยังหน้าอื่นก่อนที่คำขอ ajax เหล่านี้จะเสร็จสมบูรณ์คำขอจะถูกยกเลิกโดยเบราว์เซอร์ ELMAH HttpModule ของเราจะบันทึกข้อผิดพลาดสองข้อสำหรับแต่ละคำขอที่ถูกยกเลิก: ข้อผิดพลาด 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 …

2
ความแตกต่างระหว่าง await และ ContinueWith
คนที่สามารถอธิบายถ้าawaitและContinueWithมีความหมายเหมือนหรือไม่ได้อยู่ในตัวอย่างต่อไปนี้ ฉันพยายามใช้ TPL เป็นครั้งแรกและอ่านเอกสารทั้งหมดแล้ว แต่ไม่เข้าใจความแตกต่าง รอ : String webText = await getWebPage(uri); await parseData(webText); ดำเนินการต่อด้วย : 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
รันงาน async สองงานพร้อมกันและรวบรวมผลลัพธ์ใน. NET 4.5
ฉันพยายามมาระยะหนึ่งแล้วเพื่อหาสิ่งที่ฉันคิดว่าจะใช้งานได้ง่ายกับ. NET 4.5 ฉันต้องการปิดงานสองงานที่ทำงานเป็นเวลานานในเวลาเดียวกันและรวบรวม ผลลัพธ์ด้วยวิธี C # 4.5 (RTM) ที่ดีที่สุด ต่อไปนี้ใช้งานได้ แต่ฉันไม่ชอบเพราะ: ฉันต้องการSleepเป็นวิธี async เพื่อให้สามารถใช้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 …

13
จะ จำกัด ปริมาณการดำเนินการ async 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); }); นี่คือปัญหาเริ่มต้นคำขอเว็บพร้อมกันมากกว่า 1,000 รายการ มีวิธีง่ายๆในการ …

4
วิธีที่ง่ายที่สุดในการจุดไฟและวิธีการลืมใน c # 4.0
ฉันชอบคำถามนี้มาก: วิธีที่ง่ายที่สุดในการจุดไฟและวิธีการลืมใน C #? ฉันแค่อยากรู้ว่าตอนนี้เรามีส่วนขยายแบบขนานใน C # 4.0 แล้วมีวิธีที่ดีกว่าในการทำ Fire &amp; Forget ด้วย Parallel linq หรือไม่?

5
เหตุใดการกระทำ async จึงหยุดทำงาน
ฉันมีหลายชั้นสุทธิ 4.5 โปรแกรมประยุกต์ที่เรียกวิธีการใช้ C # 's ใหม่asyncและawaitคำหลักที่เพิ่งแฮงค์และผมก็ไม่สามารถดูว่าทำไม ที่ด้านล่างฉันมีวิธีการ async ที่ขยายยูทิลิตี้ฐานข้อมูลของเราOurDBConn(โดยทั่วไปจะเป็น wrapper สำหรับพื้นฐาน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 …

3
ไม่พบข้อยกเว้นของงานโดยการรอบนงานหรือการเข้าถึงคุณสมบัติข้อยกเว้น เป็นผลให้ข้อยกเว้นที่ไม่สามารถสังเกตได้คือ
สิ่งนี้หมายความว่าอย่างไรและจะแก้ไขได้อย่างไร? ฉันใช้งาน TPL ข้อผิดพลาดทั้งหมด ไม่พบข้อยกเว้นของงานโดยการรอบนงานหรือการเข้าถึงคุณสมบัติข้อยกเว้น ด้วยเหตุนี้ข้อยกเว้นที่ไม่สามารถสังเกตได้จึงถูกเปลี่ยนใหม่โดยเธรด Finalizer ใน System.Threading.Tasks.TaskExceptionHolder.Finalize () mscorlib

3
ไม่สามารถใช้ SynchronizationContext ปัจจุบันเป็น TaskScheduler
ผมใช้งานเพื่อให้ทำงานได้นานทำงานโทรเซิร์ฟเวอร์ใน 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.