PRN222DễKỳ 7Chuyên ngành Cập nhật 07/09/2026

Advanced Cross-Platform Application Programming With .NET - Lập trình ứng dụng đa nền tảng nâng cao với .NET

PRN222 - Lập trình ứng dụng đa nền tảng nâng cao với .NET dạy cách dựng ứng dụng web chạy trên nhiều nền tảng bằng C# 12 và .NET 8 với ASP.NET Core. Môn đi từ chỗ hai tiến trình nói chuyện được với nhau, qua cách làm cho một máy chủ phục vụ nhiều người cùng lúc mà không đứng hình, tới các mô hình dựng giao diện và các dịch vụ chạy ngầm phía sau. Lớp dưới cùng là lập trình mạng trong .NET với địa chỉ IP, hostname, DNS, URI, các giao thức TCP và UDP, TcpListener cùng AcceptSocketAsync, TcpClient, Socket, lớp Stream, HttpClient và GetAsync. Lớp kế là lập trình bất đồng bộ và song song: async/await, Task, Task.Wait, Task.WhenAll, không gian tên System.Threading.Tasks, Parallel.ForEach, Task Parallel Library, PLINQ với AsParallel, cùng ranh giới giữa tác vụ I/O-bound và tác vụ CPU-bound. Phần kiến trúc dựng Dependency Injection và Inversion of Control trên nền nguyên lý SOLID, với AddScoped, AddTransient, AddSingleton và các vòng đời service, constructor injection, property injection, IServiceProvider, Dependency Inversion và Open Closed. Trên nền đó là ba lối dựng giao diện web. ASP.NET Core MVC tách controller, action, IActionResult, ViewResult, HttpPost, Bind, Compare, directive @model, cú pháp Razor, ViewData và ViewBag, PartialView, thư mục wwwroot, model binding và model validation qua ModelState. Razor Pages gộp trang với mã xử lý: file .cshtml, thư mục Pages, lớp PageModel, handler OnGet và OnPost, AddRazorPages, BindProperty, _Layout.cshtml, TempData, Session, Cookies, tiêm phụ thuộc vào PageModel và kiểm tra dữ liệu phía client bằng jQuery Unobtrusive Validation. Blazor đưa C# xuống trình duyệt theo ý niệm C# Everywhere, với Blazor Server, Blazor WebAssembly, hai chế độ render, component, App.razor, directive @page, @bind, @inject, khối @code và thuộc tính Parameter. Hai mảng cuối lo phần chạy ngầm: giao tiếp thời gian thực bằng SignalR với lớp Hub, IHubContext, Clients, Groups.AddToGroupAsync, Hub filters, MessagePack, tự động kết nối lại, AddSignalR, Context và User; cùng Worker Service với BackgroundService, IHostedService, Microsoft.Extensions.Hosting, ExecuteAsync, StartAsync, StopAsync, CancellationToken, cấu hình trong appsettings.json và xử lý hàng đợi. Dữ liệu đi xuyên suốt các lớp đó qua Entity Framework Core và DbContext. Học xong, người học dựng được một ứng dụng .NET nhiều tầng, chọn đúng mô hình giao diện cho từng bài toán và xử lý được phần việc chạy nền lẫn phần đẩy dữ liệu tức thời.

175Câu hỏi
4Bộ đề
8Chủ đề
5,01 đánh giá

Câu hỏi của môn

64/175 câuCòn 111
45Asynchronous programming improves applications by:4 lựa chọnTrung bình67% trả lời đúng
AAutomatically turning them into multi-threaded
BImproving performance for I/O-bound operations
CNever blocking a thread
DAlways running faster than synchronous code
Lời giải
Tính chất không đồng bộ trong lập trình giúp cải thiện ứng dụng bằng cách cải thiện hiệu suất cho các hoạt động I/O. Điều này có nghĩa là các ứng dụng có thể thực hiện các tác vụ I/O như đọc hoặc ghi file, gửi hoặc nhận dữ liệu mạng mà không phải chờ đợi kết quả. Điều này giúp ứng dụng không bị chậm lại và có thể xử lý nhiều tác vụ cùng một lúc. Tính chất không đồng bộ cũng giúp giảm thiểu việc sử dụng các tài nguyên hệ thống như CPU và bộ nhớ, từ đó cải thiện hiệu suất tổng thể của ứng dụng.
Mở trang câu hỏi này →
46Which extension method is used to enable PLINQ on a data source?4 lựa chọnDễ86% trả lời đúng
AAsQueryable()
BAsEnumerable()
CAsParallel()
DParallelQuery()
Lời giải
Để có thể sử dụng PLINQ (Parallel Language Integrated Query) trên một nguồn dữ liệu, bạn cần sử dụng phương thức mở rộng AsParallel(). Phương thức này cho phép thực hiện truy vấn song song trên dữ liệu, giúp tăng hiệu suất và tốc độ xử lý. AsParallel() thường được sử dụng trong các trường hợp cần xử lý dữ liệu lớn và phức tạp. Ví dụ, bạn có thể sử dụng nó để thực hiện các phép tính toán toán học trên một tập dữ liệu lớn, hoặc để thực hiện các truy vấn phức tạp trên một cơ sở dữ liệu lớn.
Mở trang câu hỏi này →
AIt always increases electricity consumption
BIt saves time and reduces costs
CIt restricts the use of multiple processors
DIt prevents the use of distributed resources
Lời giải
Tính toán song song (parallel computing) so với tính toán tuần tự (serial computing) có một số ưu điểm quan trọng. Một trong những lợi thế chính của tính toán song song là nó có thể xử lý nhiều nhiệm vụ cùng một lúc, nhờ đó tiết kiệm thời gian và giảm chi phí. Điều này đặc biệt hữu ích trong các ứng dụng đòi hỏi xử lý dữ liệu lớn, chẳng hạn như mô hình hóa khí hậu, phân tích dữ liệu lớn và các ứng dụng khoa học tính toán khác. Tính toán song song cũng cho phép tận dụng được sức mạnh của nhiều bộ xử lý, điều này có thể dẫn đến tốc độ xử lý nhanh hơn và hiệu suất cao hơn. Tuy nhiên, cần lưu ý rằng tính toán song song cũng có thể tiêu thụ nhiều điện năng hơn, nhưng lợi ích về thời gian và chi phí tiết kiệm có thể vượt trội.
Mở trang câu hỏi này →
48What is the primary advantage of asynchronous programming?4 lựa chọnDễ100% trả lời đúng
AIncreased CPU usage.
BImproved responsiveness and reduced blocking.
CSimplified debugging.
DReduced memory consumption.
Lời giải
Asynchronous lập trình là một kỹ thuật cho phép thực hiện nhiều tác vụ đồng thời mà không cần chờ đợi kết quả của từng tác vụ. Điều này giúp cải thiện phản hồi và giảm thiểu tình trạng bị chặn (blocking). Khi sử dụng lập trình đồng bộ, chương trình sẽ bị dừng lại chờ đợi kết quả của từng tác vụ, dẫn đến giảm hiệu suất và phản hồi chậm. Ngược lại, lập trình bất đồng bộ cho phép chương trình tiếp tục thực hiện các tác vụ khác trong khi chờ đợi kết quả, giúp cải thiện hiệu suất và phản hồi nhanh chóng. Điều này đặc biệt quan trọng trong các ứng dụng cần xử lý nhiều dữ liệu hoặc yêu cầu phản hồi nhanh chóng, chẳng hạn như các ứng dụng trò chơi, ứng dụng di động và các ứng dụng web phức tạp.
Mở trang câu hỏi này →
49In PLINQ, which method converts a LINQ query into a parallel query?4 lựa chọnDễ80% trả lời đúng
AToParallel()
BParallelize()
CAsParallel()
DRunParallel()
Lời giải
Trong PLINQ, phương thức nào chuyển đổi một truy vấn LINQ thành một truy vấn song song?
Mở trang câu hỏi này →
50What is the purpose of the Task.WhenAll() method?4 lựa chọnDễ100% trả lời đúng
ATo execute a single task.
BTo wait for all provided tasks to complete.
CTo cancel a task.
DTo create a new thread.
Lời giải
Mục đích của phương thức Task.WhenAll() là chờ đợi tất cả các nhiệm vụ được cung cấp để hoàn thành. Khi sử dụng phương thức này, bạn có thể chờ đợi cho đến khi tất cả các nhiệm vụ được thực hiện xong trước khi tiếp tục thực hiện các hành động tiếp theo. Điều này giúp đảm bảo rằng các nhiệm vụ được thực hiện đồng thời đều đã hoàn thành trước khi tiếp tục.
Mở trang câu hỏi này →
51The PageModel in Razor Pages is best described as:4 lựa chọnDễ100% trả lời đúng
AA combination of Controller and ViewModel
BA replacement for HTML
CAn Entity Framework class
DA database entity
Lời giải
PageModel trong Razor Pages được mô tả tốt nhất là một sự kết hợp giữa Controller và ViewModel. Nó chứa các thuộc tính và phương thức để xử lý dữ liệu và giao diện người dùng. PageModel thừa hưởng từ PageModelBase và có thể được sử dụng để tạo ra các trang web động. Nó cho phép bạn tách biệt logic kinh doanh và giao diện người dùng, giúp dễ dàng bảo trì và mở rộng ứng dụng. PageModel cũng cung cấp các tính năng như validation, authorization và caching, giúp bạn có thể xây dựng các ứng dụng web mạnh mẽ và hiệu quả.
Mở trang câu hỏi này →
52Dependency Inversion Principle states:4 lựa chọnDễ100% trả lời đúng
AHigh-level modules should depend on low-level modules
BBoth high-level and low-level modules should depend on abstractions
CAbstractions should depend on details
DInterfaces should depend on classes
Lời giải
Sự nguyên tắc phụ thuộc ngược (Dependency Inversion Principle) là một nguyên tắc thiết kế quan trọng trong lập trình hướng đối tượng. Nó cho rằng các mô-đun cao cấp (high-level modules) và mô-đun thấp cấp (low-level modules) nên phụ thuộc vào các abstraction (tính trừu tượng) chứ không phải vào nhau. Điều này có nghĩa là thay vì các mô-đun cao cấp phụ thuộc vào các mô-đun thấp cấp cụ thể, chúng nên phụ thuộc vào các interface hoặc abstraction chung. Điều này giúp giảm sự phụ thuộc giữa các mô-đun và tăng tính linh hoạt, dễ dàng thay đổi và mở rộng hệ thống.
Mở trang câu hỏi này →
53Which code will block the current thread?4 lựa chọnDễ83% trả lời đúng
Aawait task;
Btask.Wait();
Ctask.ContinueWith(...)
Dawait Task.WhenAll(tasks);
Lời giải

Để trả lời câu hỏi này, chúng ta cần hiểu về cách sử dụng các phương thức chờ đợi (wait) trong lập trình đa luồng. Trong lập trình đa luồng, các phương thức chờ đợi được sử dụng để ngăn chặn luồng hiện tại (thread) thực hiện các tác vụ khác cho đến khi một tác vụ cụ thể được hoàn thành. Có hai phương thức chờ đợi được sử dụng trong câu hỏi này: await task; và task.Wait();. await task; là một phương thức chờ đợi non-bloc (non-blocking), nó cho phép luồng hiện tại thực hiện các tác vụ khác trong khi chờ đợi tác vụ được chờ đợi được hoàn thành. Điều này có nghĩa là nếu có nhiều tác vụ được chờ đợi, luồng hiện tại sẽ không bị chặn. task.Wait(); là một phương thức chờ đợi bloc (blocking), nó sẽ ngăn chặn luồng hiện tại thực hiện các tác vụ khác cho đến khi tác vụ được chờ đợi được hoàn thành. Điều này có nghĩa là nếu có nhiều tác vụ được chờ đợi, luồng hiện tại sẽ bị chặn. task.ContinueWith(...) và await Task.WhenAll(tasks); không phải là phương thức chờ đợi, mà là các phương thức được sử dụng để thực hiện các tác vụ khác khi một tác vụ được chờ đợi được hoàn thành hoặc khi tất cả các tác vụ được chờ đợi được hoàn thành. Tóm lại, để trả lời câu hỏi này, chúng ta cần hiểu về cách sử dụng các phương thức chờ đợi non-bloc và bloc trong lập trình đa luồng.

Mở trang câu hỏi này →
54What is the primary purpose of ASP.NET Core Razor Pages?4 lựa chọnDễ100% trả lời đúng
ABuilding desktop applications.
BBuilding page-centric web applications with simplified development.
CBuilding mobile applications.
DBuilding database management systems.
Lời giải
ASP.NET Core Razor Pages là một framework được sử dụng để xây dựng các ứng dụng web tập trung vào trang (page-centric) với quy trình phát triển được đơn giản hóa. Mục đích chính của nó là cung cấp một cách tiếp cận linh hoạt và dễ sử dụng để xây dựng các ứng dụng web, cho phép các nhà phát triển tập trung vào việc xây dựng các trang web và chức năng của chúng, thay vì phải lo lắng về các chi tiết kỹ thuật. Với Razor Pages, các nhà phát triển có thể tạo ra các ứng dụng web nhanh chóng và hiệu quả, đồng thời cũng có thể tận dụng được các tính năng và công nghệ tiên tiến của ASP.NET Core.
Mở trang câu hỏi này →
55What is the Parallel.ForEach method used for?4 lựa chọnDễ86% trả lời đúng
AIterating over a collection in parallel.
BAsynchronous network operations.
CManaging system resources.
DEncrypting data.
Lời giải
Métodu Parallel.ForEach được sử dụng để lặp qua một tập hợp dữ liệu song song. Điều này có nghĩa là nó sẽ thực hiện các tác vụ lặp lại đồng thời trên nhiều luồng, giúp tăng tốc độ thực hiện và hiệu suất của chương trình. Điều này đặc biệt hữu ích khi bạn cần xử lý một lượng lớn dữ liệu và muốn tận dụng tối đa khả năng của máy tính. Ví dụ, nếu bạn cần đọc dữ liệu từ một tập tin lớn, bạn có thể sử dụng Parallel.ForEach để đọc dữ liệu đồng thời từ nhiều phần của tập tin, giúp giảm thời gian thực hiện.
Mở trang câu hỏi này →
56What is the purpose of the IServiceProvider interface?4 lựa chọnDễ100% trả lời đúng
ATo define database connections.
BTo resolve registered services from the DI container.
CTo define network protocols.
DTo define user interface elements.
Lời giải
Lớp IServiceProvider là một giao diện quan trọng trong mô hình Dependency Injection (DI). Mục đích chính của giao diện này là cung cấp một cách thức để giải quyết các dịch vụ đã được đăng ký trong container DI. Khi một ứng dụng sử dụng mô hình DI, nó sẽ đăng ký các dịch vụ cần thiết vào container. Sau đó, khi ứng dụng cần sử dụng một dịch vụ, nó sẽ sử dụng giao diện IServiceProvider để giải quyết dịch vụ đó từ container. Điều này giúp ứng dụng trở nên linh hoạt và dễ dàng quản lý các dịch vụ của mình.
Mở trang câu hỏi này →
57Which of the following is a drawback of Blazor WebAssembly?4 lựa chọnTrung bình50% trả lời đúng
ARequires .NET runtime installed on the client
BLarger initial download size
CNo component model
DNo data binding support
Lời giải
Blazor WebAssembly là một công nghệ phát triển ứng dụng web sử dụng mã nguồn mở .NET. Mặc dù nó mang lại nhiều lợi ích, nhưng cũng có một số nhược điểm. Một trong những nhược điểm chính của Blazor WebAssembly là kích thước tải về ban đầu lớn hơn so với các công nghệ khác. Điều này có thể gây khó khăn cho người dùng có kết nối internet chậm hoặc thiết bị có bộ nhớ hạn chế. Ngoài ra, kích thước lớn của Blazor WebAssembly cũng có thể ảnh hưởng đến hiệu suất của ứng dụng. Tuy nhiên, cần lưu ý rằng kích thước tải về ban đầu có thể được giảm thiểu bằng cách sử dụng các công nghệ như mã hóa và nén.
Mở trang câu hỏi này →
ASorting a large array.
BRendering a complex 3D scene.
CDownloading a file from the internet.
DPerforming a CPU-intensive calculation.
Lời giải
Một ví dụ về hoạt động I/O có thể được thực hiện bằng cách lập trình đồng bộ là tải một tệp từ internet. Hoạt động I/O là những hoạt động liên quan đến nhập/xuất dữ liệu từ các thiết bị ngoại vi như mạng internet, đĩa cứng, v.v. Các hoạt động này thường chậm hơn so với các hoạt động tính toán và có thể được thực hiện đồng thời với các hoạt động khác. Lập trình đồng bộ là một kỹ thuật lập trình cho phép các hoạt động I/O được thực hiện đồng thời với các hoạt động khác, giúp tăng hiệu suất và giảm thời gian chờ đợi. Ví dụ, khi tải một tệp từ internet, bạn có thể thực hiện các hoạt động khác trong khi chờ đợi tệp được tải xong.
Mở trang câu hỏi này →
59What is the purpose of the ViewBag or ViewData in ASP.NET Core MVC?4 lựa chọnDễ100% trả lời đúng
ATo manage database connections.
BTo pass data from a controller to a view.
CTo encrypt data.
DTo manage user sessions.
Lời giải
Trong ASP.NET Core MVC, ViewBag và ViewData là hai đối tượng được sử dụng để truyền dữ liệu từ controller sang view. Chúng giúp bạn có thể dễ dàng chia sẻ dữ liệu giữa các lớp controller và view mà không cần phải sử dụng đến các phương thức phức tạp. ViewBag và ViewData đều là các đối tượng động, có thể được sử dụng để truyền dữ liệu của bất kỳ loại nào, bao gồm cả các đối tượng phức tạp như danh sách hoặc các đối tượng có liên quan. Việc sử dụng ViewBag và ViewData giúp bạn có thể dễ dàng quản lý dữ liệu và giảm thiểu sự phức tạp trong việc chia sẻ dữ liệu giữa các lớp.
Mở trang câu hỏi này →
60What is the role of the IHubContext interface?4 lựa chọnDễ100% trả lời đúng
ATo manage database connections.
BTo allow sending messages from outside a hub class.
CTo encrypt data.
DTo manage user sessions.
Lời giải
IHubContext là một giao diện quan trọng trong ASP.NET Core SignalR, cho phép bạn gửi tin nhắn từ bên ngoài một lớp trung tâm (hub class). Điều này cho phép bạn tương tác với các phương thức trong lớp trung tâm từ các lớp khác, giúp tăng tính linh hoạt và khả năng mở rộng của ứng dụng. Khi sử dụng IHubContext, bạn có thể gửi tin nhắn đến các khách hàng (clients) đã kết nối với lớp trung tâm, giúp cập nhật trạng thái hoặc thực hiện các hành động khác. Điều này đặc biệt hữu ích khi bạn cần tương tác với lớp trung tâm từ các lớp khác trong ứng dụng.
Mở trang câu hỏi này →
61Which of the following is NOT a type of Dependency Injection?4 lựa chọnDễ71% trả lời đúng
AConstructor Injection
BSetter Injection
CMethod Injection
DDatabase Injection
Lời giải
Tùy chọn không phải là loại Dependency Injection là Database Injection. Dependency Injection là một kỹ thuật lập trình giúp giảm sự phụ thuộc giữa các lớp và các thành phần trong một ứng dụng. Có ba loại Dependency Injection chính: Constructor Injection, Setter Injection và Method Injection. Constructor Injection là kỹ thuật truyền đối tượng phụ thuộc vào một lớp thông qua phương thức constructor của lớp đó. Điều này giúp giảm sự phụ thuộc giữa các lớp và tăng tính linh hoạt của ứng dụng. Setter Injection là kỹ thuật truyền đối tượng phụ thuộc vào một lớp thông qua phương thức setter của lớp đó. Điều này giúp giảm sự phụ thuộc giữa các lớp và tăng tính linh hoạt của ứng dụng. Method Injection là kỹ thuật truyền đối tượng phụ thuộc vào một lớp thông qua phương thức khác của lớp đó. Điều này giúp giảm sự phụ thuộc giữa các lớp và tăng tính linh hoạt của ứng dụng. Database Injection là một kỹ thuật tấn công bảo mật, không phải là một loại Dependency Injection. Nó liên quan đến việc sử dụng mã SQL để tấn công các ứng dụng web và lấy được dữ liệu nhạy cảm.
Mở trang câu hỏi này →
62What is the role of the _Layout.cshtml file in Razor Pages?4 lựa chọnDễ100% trả lời đúng
ATo define a database schema.
BTo provide a common layout for multiple Razor Pages.
CTo encrypt data.
DTo manage user sessions.
Lời giải
Trong Razor Pages, _Layout.cshtml là một file quan trọng giúp định nghĩa cấu trúc chung cho nhiều trang Razor Pages. Nó giống như một bản thiết kế chung cho các trang web, bao gồm các phần như header, footer, navigation menu, v.v. Mục đích chính của _Layout.cshtml là giúp tạo ra một giao diện thống nhất cho toàn bộ ứng dụng, từ đó dễ dàng quản lý và cập nhật các phần tử giao diện.
Mở trang câu hỏi này →
63Consider this C# code:4 lựa chọncó codeDễ89% trả lời đúng
Đề bài
public IActionResult Index() {
  ViewBag.Count = 10;
  return View();
}

Razor: <p>@(ViewBag.Count + 5)</p> What happens?

A15
B105
CError
DNothing
Lời giải
Khi chạy mã C# trên, chúng ta sẽ thấy kết quả là 15. Lý do là vì trong phương thức Index(), chúng ta đã gán giá trị 10 vào biến ViewBag.Count. Sau đó, trong Razor, chúng ta sử dụng biểu thức @ để truy cập vào giá trị của ViewBag.Count và thực hiện phép tính cộng với 5. Kết quả của phép tính này sẽ được hiển thị trên màn hình. Điều này cho thấy rằng ViewBag là một cách để truyền dữ liệu từ controller sang view trong ứng dụng ASP.NET.
Mở trang câu hỏi này →
64How many tasks does the following code create?4 lựa chọncó codeDễ86% trả lời đúng
Đề bài
for (int i = 0; i < 3; i++) {
  Task t = new Task(() => Console.WriteLine(i));
  t.Start();
}
A1
B2
C3
D6
Lời giải
Mã nguồn trên tạo ra 3 nhiệm vụ. Khi sử dụng vòng lặp for để tạo ra các nhiệm vụ, mỗi lần lặp sẽ tạo ra một nhiệm vụ mới. Trong trường hợp này, mã nguồn sẽ lặp 3 lần, tạo ra 3 nhiệm vụ. Tuy nhiên, cần lưu ý rằng mỗi nhiệm vụ sẽ thực hiện một hành động tương tự, đó là in ra giá trị của biến i. Do đó, mặc dù có 3 nhiệm vụ nhưng giá trị in ra sẽ chỉ là 0, 1 và 2 lần lượt trong 3 nhiệm vụ đầu tiên. Nhiệm vụ thứ 4 sẽ không được tạo ra vì điều kiện vòng lặp là i < 3.
Mở trang câu hỏi này →