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

175/175 câuHết danh sách
AIn the browser using WebAssembly.
BOn the server.
CIn a separate desktop application.
DOn a mobile device.
Lời giải
Đáp án đúng: "On the server". Trong Blazor Server, toàn bộ mã C# và cây component chạy TRÊN MÁY CHỦ. Trình duyệt chỉ giữ một kết nối SignalR thường trực, gửi sự kiện người dùng lên máy chủ và nhận về phần chênh lệch của DOM để cập nhật giao diện. Nhờ vậy tải tải về ban đầu rất nhẹ và mã nguồn không lộ ra máy khách, nhưng ứng dụng phụ thuộc vào độ trễ mạng và không chạy được khi mất kết nối. Chạy trong trình duyệt bằng WebAssembly là mô hình của Blazor WebAssembly; "In a separate desktop application" và "On a mobile device" mô tả những môi trường không liên quan.
Mở trang câu hỏi này →
AIt stores data in memory only.
BIt stores data in session state or cookies, depending on configuration.
CIt stores data in the database.
DIt stores data in the file system.
Lời giải
Đáp án đúng: "It stores data in session state or cookies, depending on configuration". TempData dùng để giữ dữ liệu qua ĐÚNG một lần chuyển hướng, và nơi lưu phụ thuộc vào provider được cấu hình: mặc định trong ASP.NET Core là CookieTempDataProvider - lưu vào cookie đã mã hoá; nếu đăng ký SessionStateTempDataProvider thì dữ liệu nằm trong session state. Vì vậy phát biểu đúng là lưu trong session hoặc cookie tuỳ cấu hình. Phương án "It stores data in memory only" sai vì dữ liệu không chỉ nằm trong bộ nhớ tiến trình; các phương án "It stores data in the database" và "It stores data in the file system" sai vì TempData không ghi xuống cơ sở dữ liệu hay hệ thống tệp.
Mở trang câu hỏi này →
AA system with multiple CPUs.
BA system with a single CPU.
CA system with multiple cores.
DA distributed system.
Lời giải
Đáp án đúng: "A system with a single CPU." Hệ thống đơn bộ xử lý (mono-processor, còn gọi uniprocessor) là hệ chỉ có MỘT CPU đảm nhiệm toàn bộ việc thực thi lệnh; tại một thời điểm nó chỉ chạy được một luồng lệnh, và cảm giác đa nhiệm có được là nhờ hệ điều hành luân phiên chia thời gian. Hệ nhiều CPU ("A system with multiple CPUs.") là multi-processor; hệ một CPU nhiều lõi ("A system with multiple cores.") đã có khả năng thực thi song song thật sự nên không còn là mono-processor theo nghĩa cổ điển; hệ phân tán ("A distributed system.") gồm nhiều máy độc lập nối mạng, thuộc phạm trù hoàn toàn khác.
Mở trang câu hỏi này →
168Which method stops a hosted service?4 lựa chọn
AStopAsync()
BEndAsync()
CseAsync()
DShutdownAsync()
Lời giải
Đáp án đúng: "StopAsync()". Giao diện IHostedService định nghĩa đúng hai phương thức: StartAsync(CancellationToken) được host gọi khi khởi động và StopAsync(CancellationToken) được gọi khi ứng dụng tắt để dịch vụ dọn dẹp và kết thúc êm. Lớp BackgroundService hiện thực hoá sẵn cặp này và cho ta ghi đè ExecuteAsync. Các tên EndAsync(), seAsync() và ShutdownAsync() không tồn tại trong hợp đồng IHostedService nên đều không phải phương thức dừng dịch vụ.
Mở trang câu hỏi này →
169Consider this C# code:4 lựa chọncó code
Đề bài
public class FileLogger
{
   public void Log(string message)
     => Console.WriteLine(message);
}

public class OrderService
{
   private FileLogger logger = new FileLogger();
}

Which principle is violated here?

ASingle Responsibility Principle
BOpen/Closed Principle
CDependency Inversion Principle
DInterface Segregation Principle
Lời giải
Đáp án đúng: "Dependency Inversion Principle". OrderService tự khởi tạo một FileLogger cụ thể bằng new, nghĩa là mô-đun cấp cao phụ thuộc trực tiếp vào lớp hiện thực cấp thấp thay vì vào một trừu tượng như ILogger. Đó chính là vi phạm Nguyên lý Đảo ngược Phụ thuộc; cách sửa là khai báo interface ILogger, cho OrderService nhận nó qua constructor và để DI container cung cấp. Trách nhiệm của OrderService vẫn đơn nhất nên chưa vi phạm SRP ("Single Responsibility Principle"); không có chỗ nào phải sửa mã cũ để mở rộng nên chưa động tới OCP ("Open/Closed Principle"); và cũng không có interface phình to nào để nói tới ISP ("Interface Segregation Principle").
Mở trang câu hỏi này →
ATo create tightly coupled classes.
BTo depend on abstractions, not concretions.
CTo create large, monolithic classes.
DTo avoid using interfaces.
Lời giải
Đáp án đúng: "To depend on abstractions, not concretions". Nguyên lý Đảo ngược Phụ thuộc phát biểu rằng mô-đun cấp cao và mô-đun cấp thấp đều phải phụ thuộc vào TRỪU TƯỢNG, và trừu tượng không phụ thuộc vào chi tiết mà ngược lại. Mục đích là cắt đứt sự ràng buộc cứng giữa các lớp, giúp thay thế hiện thực, viết kiểm thử với đối tượng giả và mở rộng hệ thống dễ dàng. Phương án "To create tightly coupled classes" đi ngược mục tiêu vì tạo ra ghép nối chặt; "To create large, monolithic classes" nói về lớp lớn monolithic, thuộc vấn đề của SRP; "To avoid using interfaces" sai hoàn toàn vì DIP dựa chính vào interface.
Mở trang câu hỏi này →
AOn the server.
BIn the browser using WebAssembly.
CIn a separate desktop application.
DOn a mobile device.
Lời giải
Đáp án đúng: "In the browser using WebAssembly." Trong Blazor WebAssembly, thời gian chạy .NET được biên dịch sang WebAssembly và tải về trình duyệt, nên toàn bộ mã C# thực thi NGAY TRONG TRÌNH DUYỆT ở phía máy khách. Nhờ vậy ứng dụng chạy được cả khi ngoại tuyến và không tốn kết nối thường trực tới máy chủ, đổi lại tải về ban đầu lớn hơn và mã có thể bị xem xét từ phía người dùng. Chạy trên máy chủ ("On the server.") là mô hình Blazor Server; "In a separate desktop application." và "On a mobile device." mô tả những môi trường thực thi không đúng với Blazor WebAssembly.
Mở trang câu hỏi này →
AEvent-based Asynchronous Pattern (EAP)
BAsynchronous Programming Model (APM)
CTask-based Asynchronous Pattern (TAP)
DDelegate pattern
Lời giải

Đáp án đúng: "Task-based Asynchronous Pattern (TAP)". async/await trong C# được xây trên Task-based Asynchronous Pattern: một phương thức bất đồng bộ trả về Task hoặc Task<T>, và await tạm dừng phương thức cho tới khi Task hoàn tất mà không chặn luồng. TAP ra đời từ .NET 4 và là mẫu được khuyến nghị hiện nay. Event-based Asynchronous Pattern là mẫu cũ dùng cặp phương thức MethodAsync kèm sự kiện MethodCompleted; Asynchronous Programming Model là mẫu còn cũ hơn với cặp BeginXxx/EndXxx và IAsyncResult; mẫu delegate không phải một mô hình bất đồng bộ chuẩn.

Mở trang câu hỏi này →
Đề bài
// Controller
ViewData["Number"] = 123; // ViewData requires casting in the view.
ViewBag.Text = "Hello"; // ViewBag does not require casting.

//View
<p>Number: @((int)ViewData["Number"])</p>
<p>Text: @ViewBag.Text</p>
AViewBag is strongly typed, while ViewData is dynamically typed.
BViewData is strongly typed, while ViewBag is dynamically typed.
CBoth ViewBag and ViewData are strongly typed.
DBoth ViewBag and ViewData are dynamically typed.
Lời giải
Đáp án đúng: "Both ViewBag and ViewData are dynamically typed.". Cả ViewBag lẫn ViewData đều KHÔNG phải kiểu mạnh. ViewData là ViewDataDictionary, tức từ điển chuỗi - object, nên khi lấy ra phải ép kiểu như @((int)ViewData["Number"]) và lỗi ép kiểu chỉ lộ ra lúc chạy. ViewBag chỉ là lớp bọc dynamic quanh chính ViewData, nhờ dynamic mà viết @ViewBag.Text không cần ép kiểu nhưng cũng không được trình biên dịch kiểm tra. Vì vậy A, B và C đều sai khi gán nhãn "strongly typed" cho một trong hai. Muốn kiểu mạnh thì phải dùng view model với chỉ thị @model.
Mở trang câu hỏi này →
AIncreased memory usage.
BReduced network bandwidth.
CSimplified debugging.
DData races and inconsistent results.
Lời giải
Đáp án đúng: "Data races and inconsistent results." Khi nhiều luồng cùng đọc và ghi lên một vùng dữ liệu chia sẻ mà không có cơ chế đồng bộ như lock, Monitor, Interlocked hay các bộ sưu tập concurrent, thì thứ tự thao tác trở nên bất định và sinh ra data race: kết quả sai lệch, thay đổi giữa các lần chạy và rất khó tái hiện khi gỡ lỗi. Đó là rủi ro nghiêm trọng nhất của lập trình song song. Tăng bộ nhớ ("Increased memory usage.") chỉ là chi phí phụ; giảm băng thông mạng ("Reduced network bandwidth.") không liên quan; và gỡ lỗi trở nên KHÓ hơn chứ không đơn giản hơn nên "Simplified debugging." sai hẳn.
Mở trang câu hỏi này →
175What is a multi-processor system?4 lựa chọn
AA system with a single CPU core.
BA system with multiple CPUs.
CA system with a single thread.
DA system with no network connection.
Lời giải
Đáp án đúng: "A system with multiple CPUs." Hệ đa bộ xử lý là hệ thống có từ hai CPU trở lên cùng chia sẻ bộ nhớ và hệ điều hành, nhờ đó nhiều luồng lệnh thực sự chạy đồng thời chứ không chỉ luân phiên chia thời gian. Đây là nền tảng phần cứng cho lập trình song song với Task Parallel Library hay Parallel.For trong .NET. Hệ một lõi CPU ("A system with a single CPU core.") chính là mono-processor; hệ chỉ có một luồng ("A system with a single thread.") nói về mô hình thực thi phần mềm chứ không phải cấu hình phần cứng; và việc có hay không kết nối mạng ("A system with no network connection.") hoàn toàn không liên quan tới số bộ xử lý.
Mở trang câu hỏi này →