diff --git a/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/CodeChunks.db b/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/CodeChunks.db new file mode 100644 index 0000000..bee808a Binary files /dev/null and b/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/CodeChunks.db differ diff --git a/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db b/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db new file mode 100644 index 0000000..527188c Binary files /dev/null and b/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db differ diff --git a/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db-shm b/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db-shm new file mode 100644 index 0000000..45b8e2c Binary files /dev/null and b/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db-shm differ diff --git a/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db-wal b/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db-wal new file mode 100644 index 0000000..0e90aa2 Binary files /dev/null and b/.vs/Async-and-Multi_thread/CopilotIndices/0.2.1634.3922/SemanticSymbols.db-wal differ diff --git a/.vs/Async-and-Multi_thread/FileContentIndex/62af47c7-bf26-49bc-b556-52b1d0e8c2d5.vsidx b/.vs/Async-and-Multi_thread/FileContentIndex/62af47c7-bf26-49bc-b556-52b1d0e8c2d5.vsidx new file mode 100644 index 0000000..aa5f10f Binary files /dev/null and b/.vs/Async-and-Multi_thread/FileContentIndex/62af47c7-bf26-49bc-b556-52b1d0e8c2d5.vsidx differ diff --git a/.vs/Async-and-Multi_thread/v17/.wsuo b/.vs/Async-and-Multi_thread/v17/.wsuo new file mode 100644 index 0000000..187e2fc Binary files /dev/null and b/.vs/Async-and-Multi_thread/v17/.wsuo differ diff --git a/.vs/Async-and-Multi_thread/v17/DocumentLayout.backup.json b/.vs/Async-and-Multi_thread/v17/DocumentLayout.backup.json new file mode 100644 index 0000000..9f688c4 --- /dev/null +++ b/.vs/Async-and-Multi_thread/v17/DocumentLayout.backup.json @@ -0,0 +1,37 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\32084\\Desktop\\Async-and-Multi_thread\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\32084\\Desktop\\Async-and-Multi_thread\\homework.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:homework.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "homework.cs", + "DocumentMoniker": "C:\\Users\\32084\\Desktop\\Async-and-Multi_thread\\homework.cs", + "RelativeDocumentMoniker": "homework.cs", + "ToolTip": "C:\\Users\\32084\\Desktop\\Async-and-Multi_thread\\homework.cs", + "RelativeToolTip": "homework.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABcAAAArAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-08-28T03:16:16.226Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/Async-and-Multi_thread/v17/DocumentLayout.json b/.vs/Async-and-Multi_thread/v17/DocumentLayout.json new file mode 100644 index 0000000..9f688c4 --- /dev/null +++ b/.vs/Async-and-Multi_thread/v17/DocumentLayout.json @@ -0,0 +1,37 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\32084\\Desktop\\Async-and-Multi_thread\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\32084\\Desktop\\Async-and-Multi_thread\\homework.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:homework.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "homework.cs", + "DocumentMoniker": "C:\\Users\\32084\\Desktop\\Async-and-Multi_thread\\homework.cs", + "RelativeDocumentMoniker": "homework.cs", + "ToolTip": "C:\\Users\\32084\\Desktop\\Async-and-Multi_thread\\homework.cs", + "RelativeToolTip": "homework.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABcAAAArAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-08-28T03:16:16.226Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..d282b3b --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\README.md", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000..6c3dc60 Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/homework.cs b/homework.cs index 91a7fc0..980d6d4 100644 --- a/homework.cs +++ b/homework.cs @@ -29,7 +29,25 @@ public Task> GetBooksAsync() public async Task UpdateInventoryAsync(string title, int quantity) { await Task.Delay(100); // 模拟网络延迟 - + lock (_lock) { + var book = _books.Find(b => b.Title == title); + if (book != null) + { + if (book.Inventory >= quantity) + { + book.Inventory -= quantity; + Console.WriteLine($"成功购买 {quantity} 本《{title}》,剩余库存:{book.Inventory} 本"); + } + else + { + Console.WriteLine($"库存不足,无法购买 {quantity} 本《{title}》,当前库存:{book.Inventory} 本"); + } + } + else + { + Console.WriteLine($"书籍《{title}》不存在"); + } + } // TODO: 使用 lock 语句保证线程安全 // 提示:在 lock 块中查找书籍并更新库存,若库存不足则输出提示 } @@ -42,6 +60,7 @@ public class BookStore // TODO: 实现异步购书方法CheckoutAsync,调用 UpdateInventoryAsync public async Task CheckoutAsync(string bookTitle, int quantity) { + await _db.UpdateInventoryAsync(bookTitle, quantity); } public async Task SimulateMultipleUsers() @@ -59,10 +78,14 @@ public async Task SimulateMultipleUsers() // 提示:创建多个 Task 调用 CheckoutAsync,并传入不同书名和数量 var tasks = new List { - + CheckoutAsync("C#入门", 2), + CheckoutAsync("C#入门", 3), + CheckoutAsync("异步编程", 1), + CheckoutAsync("异步编程", 2), + CheckoutAsync("异步编程", 3) }; - + await Task.WhenAll(tasks); Console.WriteLine("\n购买后库存:"); books = await _db.GetBooksAsync(); foreach (var book in books)