Tải bản đầy đủ (.pdf) (10 trang)

Các giải pháp lập trình CSharp- P16 ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.62 MB, 10 trang )

151
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
Ví dụ dưới đây sử dụng
Process
để thực thi Notepad trong một cửa sổ ở trạng thái phóng to và
mở một file có tên là C:\Temp\file.txt. Sau khi tạo, ví dụ này sẽ gọi phương thức
Process.WaitForExit
để dừng tiểu trình đang chạy cho đến khi tiến trình kết thúc hoặc giá trị
time-out (được chỉ định trong phương thức này) hết hiệu lực.
using System;
using System.Diagnostics;
public class StartProcessExample {
public static void Main () {
// Tạo một đối tượng ProcessStartInfo và cấu hình cho nó
// với các thông tin cần thiết để chạy tiến trình mới.
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "notepad.exe";
startInfo.Arguments = "file.txt";
startInfo.WorkingDirectory = @"C:\Temp";
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.ErrorDialog = true;
// Tạo một đối tượng Process mới.
using (Process process = new Process()) {
// Gán ProcessStartInfo vào Process.
process.StartInfo = startInfo;
try {
// Khởi chạy tiến trình mới.
process.Start();
// Đợi tiến trình mới kết thúc trước khi thoát.
Console.WriteLine("Waiting 30 seconds for process to" +
" finish.");


process.WaitForExit(30000);
} catch (Exception ex) {
152
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
Console.WriteLine("Could not start process.");
Console.WriteLine(ex);
}
}
// Nhấn Enter để kết thúc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
11.
11.
K t thúc m t ti n trìnhế ộ ế
K t thúc m t ti n trìnhế ộ ế


Bạn muốn kết thúc một tiến trình (một ứng dụng hay một dịch vụ).


Thu lấy đối tượng
Process
mô tả tiến trình hệ điều hành cần kết thúc. Đối với các
ứng dụng dựa-trên-
Windows
, hãy gọi phương thức
Process.CloseMainWindow
để

gửi một thông điệp đến cửa sổ chính của ứng dụng. Đối với các ứng dụng dựa-
trên-
Windows
bỏ qua
CloseMainWindow
, hay đối với các ứng dụng không-dựa-
trên-
Windows
, gọi phương thức
Process.Kill
.
Nếu khởi chạy một tiến trình mới từ mã lệnh được-quản-lý bằng lớp
Process
(đã được thảo
luận trong mục 4.10), bạn có thể kết thúc tiến trình mới bằng đối tượng
Process
mô tả tiến
trình này. Bạn cũng có thể thu lấy các đối tượng
Process
chỉ đến các tiến trình khác hiện đang
chạy bằng các phương thức tĩnh của lớp
Process
(được tóm tắt trong bảng 4.4).
Bảng 4.4
Các phương thức dùng để thu lấy các tham chiếu Process
Phương thức Mô tả
GetCurrentProcess
Trả về đối tượng
Process
mô tả tiến trình hiện đang tích cực.

GetProcessById
Trả về đối tượng
Process
mô tả tiến trình với ID được chỉ định.
GetProcesses
Trả về mảng các đối tượng
Process
mô tả tất cả các tiến trình
hiện đang tích cực.
GetProcessesByName
Trả về mảng các đối tượng
Process
mô tả tất cả các tiến trình
hiện đang tích cực với tên thân thiện được chỉ định. Tên thân
thiện là tên của file thực thi không tính phần mở rộng và đường
dẫn; ví dụ, notepad hay calc.
Một khi đã có đối tượng
Process
mô tả tiến trình cần kết thúc, bạn cần gọi phương thức
CloseMainWindow
hay phương thức
Kill
. Phương thức
CloseMainWindow
gửi một thông điệp
đến cửa sổ chính của ứng dụng dựa-trên-Windows. Phương thức này có cùng tác dụng như thể
153
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
người dùng đóng cửa sổ chính bằng trình đơn hệ thống, và nó cho cơ hội ứng dụng thực hiện
việc tắt một cách bình thường.

CloseMainWindow
sẽ không kết thúc các ứng dụng không có cửa
sổ chính hoặc các ứng dụng có cửa sổ chính bị vô hiệu (có thể vì một hộp thoại hiện đang
được mở). Với những tình huống như thế,
CloseMainWindow
sẽ trả về
false
.
CloseMainWindow
trả về
true
nếu thông điệp được gửi thành công, nhưng không bảo đảm tiến
trình thật sự kết thúc. Ví dụ, các ứng dụng dùng để soạn thảo dữ liệu thường sẽ cho cơ hội
người dùng lưu lại các dữ liệu chưa được lưu nếu nhận được thông điệp này. Người dùng
thường có cơ hội hủy bỏ việc đóng cửa sổ với những tình huống như thế. Điều này nghĩa là
CloseMainWindow
sẽ trả về
true
, nhưng ứng dụng vẫn cứ chạy khi người dùng hủy bỏ. Bạn có
thể sử dụng phương thức
Process.WaitForExit
để báo hiệu việc kết thúc tiến trình và thuộc
tính
Process.HasExited
để kiểm tra tiến trình đã kết thúc hay chưa. Và bạn cũng có thể sử
dụng phương thức
Kill
.
Phương thức
Kill

kết thúc một tiến trình ngay lập tức; người dùng không có cơ hội dừng việc
kết thúc, và tất cả các dữ liệu chưa được lưu sẽ bị mất.
Kill
là tùy chọn duy nhất để kết thúc
các ứng dụng dựa-trên-Windows không đáp lại
CloseMainWindow
và để kết thúc các ứng dụng
không-dựa-trên-Windows.
Ví dụ dưới đây khởi chạy một thể hiện mới của Notepad, đợi 5 giây, sau đó kết thúc tiến trình
Notepad. Trước tiên, ví dụ này kết thúc tiến trình bằng
CloseMainWindow
. Nếu
CloseMainWindow
trả về
false
, hoặc tiến trình Notepad vẫn cứ chạy sau khi
CloseMainWindow
được gọi, ví dụ này sẽ gọi
Kill
và buộc tiến trình Notepad kết thúc; bạn có thể buộc
CloseMainWindow
trả về
false
bằng cách bỏ mặc hộp thoại File Open mở.
using System;
using System.Threading;
using System.Diagnostics;
public class TerminateProcessExample {
public static void Main () {
// Tạo một Process mới và chạy notepad.exe.

using (Process process = Process.Start("notepad.exe")) {
// Đợi 5 giây và kết thúc tiến trình Notepad.
Console.WriteLine("Waiting 5 seconds before terminating" +
" notepad.exe.");
Thread.Sleep(5000);
// Kết thúc tiến trình Notepad.
Console.WriteLine("Terminating Notepad with " +
"CloseMainWindow.");
// Gửi một thông điệp đến cửa sổ chính.
154
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
if (!process.CloseMainWindow()) {
// Không gửi được thông điệp. Kết thúc Notepad bằng Kill.
Console.WriteLine("CloseMainWindow returned false - " +
" terminating Notepad with Kill.");
process.Kill();
} else {
// Thông điệp được gửi thành công; đợi 2 giây
// để chứng thực việc kết thúc trước khi viện đến Kill.
if (!process.WaitForExit(2000)) {
Console.WriteLine("CloseMainWindow failed to" +
" terminate - terminating Notepad with Kill.");
process.Kill();
}
}
}
// Nhấn Enter để kết thúc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}

}
12.
12.
B o đ m ch có th ch yả ả ỉ ể ạ
B o đ m ch có th ch yả ả ỉ ể ạ
m t th hi n c a ng d ng t i m t th i đi mộ ể ệ ủ ứ ụ ạ ộ ờ ể
m t th hi n c a ng d ng t i m t th i đi mộ ể ệ ủ ứ ụ ạ ộ ờ ể


Bạn cần bảo đảm rằng, tại một thời điểm chỉ có thể chạy một thể hiện của ứng
dụng.


Tạo một đối tượng
System.Threading.Mutex
và bảo ứng dụng thu lấy quyền sở
hữu đối tượng này lúc khởi động.
Mutex
cung cấp một cơ chế để đồng bộ hóa quá trình thực thi của các tiểu trình vượt qua biên
tiến trình và còn cung cấp một cơ chế tiện lợi để bảo rằng chỉ một thể hiện của ứng dụng đang
chạy. Bằng cách cố thu lấy quyền sở hữu một đối tượng
Mutex
lúc khởi động và thoát nếu
155
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
không thể thu được
Mutex
, bạn có thể bảo đảm rằng chỉ một thể hiện của ứng dụng đang chạy.
Ví dụ dưới đây sử dụng một
Mutex

có tên là
MutexExample
để bảo đảm chỉ một thể hiện của ví
dụ có thể thực thi.
using System;
using System.Threading;
public class MutexExample {
public static void Main() {
// Giá trị luận lý cho biết ứng dụng này
// có quyền sở hữu Mutex hay không.
bool ownsMutex;
// Tạo và lấy quyền sở hữu một Mutex có tên là MutexExample.
using (Mutex mutex =
new Mutex(true, "MutexExample", out ownsMutex)) {
// Nếu ứng dụng sở hữu Mutex, nó có thể tiếp tục thực thi;
// nếu không, ứng dụng sẽ thoát.
if (ownsMutex) {
Console.WriteLine("This application currently owns the" +
" mutex named MutexExample. Additional instances" +
" of this application will not run until you" +
" release the mutex by pressing Enter.");
Console.ReadLine();
// Giải phóng Mutex.
mutex.ReleaseMutex();
} else {
Console.WriteLine("Another instance of this" +
" application already owns the mutex named" +
" MutexExample. This instance of the" +
" application will terminate.");
156

Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
}
}
// Nhấn Enter để kết thúc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}


5
157
Chương 5:XML
158
159
Chương 5: XML
ột trong những khía cạnh đáng chú ý nhất của Microsoft .NET Framework là sự
tích hợp sâu sắc với XML. Trong nhiều ứng dụng .NET, bạn sẽ không nhận thấy
rằng mình đang sử dụng các kỹ thuật XML—chúng sẽ được sử dụng phía hậu
trường khi bạn tuần tự hóa một Microsoft ADO.NET DataSet, gọi một dịch vụ Web XML,
hoặc đọc các thiết lập ứng dụng trong một file cấu hình Web.config. Trong các trường hợp
khác, bạn sẽ muốn làm việc trực tiếp với không gian tên
System.Xml
để thao tác dữ liệu XML.
Các tác vụ XML thông thường không chỉ phân tích một file XML mà còn xác nhận tính hợp lệ
của nó dựa trên một XML Schema, áp dụng phép biến đổi XSL để tạo một tài liệu hay trang
HTML mới, và tìm kiếm một cách thông minh với XPath. Các mục trong chương này trình
bày các vấn đề sau:
M


Các kỹ thuật dùng để đọc, phân tích, và thao tác dữ liệu XML (mục 5.1, 5.2, 5.3, và
5.7).

Duyệt một tài liệu XML để tìm các nút cụ thể theo tên (mục 5.4), theo không gian tên
(mục 5.5), hay theo biểu thức XPath (mục 5.6).

Xác nhận tính hợp lệ của một tài liệu XML dựa trên một XML Schema (mục 5.8).

Tuần tự hóa một đối tượng thành XML (mục 5.9), tạo XML Schema cho một lớp (mục
5.10), và tạo mã nguồn cho lớp dựa trên một XML Schema (mục 5.11).

Biến đổi một tài liệu XML thành một tài liệu khác bằng XSLT stylesheet (mục 5.12).
1.
1.
Hi n th c u trúc c a m t tài li u XML trong TreeViewể ị ấ ủ ộ ệ
Hi n th c u trúc c a m t tài li u XML trong TreeViewể ị ấ ủ ộ ệ


Bạn cần hiển thị cấu trúc và nội dung của một tài liệu
XML
trong một ứng dụng
dựa-trên
-Windows
.


Nạp tài liệu
XML
bằng lớp
System.Xml.XmlDocument

. Sau đó, viết một phương
thức để chuyển một
XmlNode
thành một
System.Windows.Forms.TreeNode
, rồi gọi
nó một cách đệ quy để duyệt qua toàn bộ tài liệu.
.NET Framework cung cấp nhiều cách khác nhau để xử lý các tài liệu XML. Cách mà bạn sử
dụng tùy thuộc vào tác vụ cần lập trình. Một trong số đó là lớp
XmlDocument
. Lớp này cung
cấp một dạng biểu diễn trong-bộ-nhớ cho một tài liệu XML, tuân theo W3C Document Object
Model (DOM); cho phép bạn duyệt qua các nút theo bất kỳ hướng nào, chèn và loại bỏ nút, và
thay đổi động cấu trúc lúc chạy. Bạn hãy vào
[

]
để biết thêm chi tiết về
DOM.
Để sử dụng lớp
XmlDocument
, bạn chỉ việc tạo một thể hiện của lớp này rồi gọi phương thức
Load
cùng với một tên file, một
Stream
, một
TextReader
, hay một
XmlReader
(bạn cũng có thể

cung cấp một URL chỉ đến một tài liệu XML). Thể hiện
XmlDocument
sẽ chứa tất cả các nút
(dạng cây) có trong tài liệu nguồn. Điểm nhập (entry point) dùng để truy xuất các nút này là
phần tử gốc, được cấp thông qua thuộc tính
XmlDocument.DocumentElement
. Đây là một đối
tượng
XmlElement
, có thể chứa nhiều đối tượng
XmlNode
lồng bên trong, các đối tượng này có
thể chứa nhiều đối tượng
XmlNode
nữa, và cứ tiếp tục như thế. Một
XmlNode
là phần cấu thành
cơ bản của một file XML. Một nút XML có thể là một phần tử (element), một đặc tính
(attribute), lời chú thích, hay text.
160
Chương 5: XML
Khi làm việc với
XmlNode
hay một lớp dẫn xuất từ đó (như
XmlElement
hay
XmlAttribute
),
bạn có thể sử dụng các thuộc tính cơ bản sau đây:


ChildNodes
là tập hợp các nút lồng bên trong ở mức đầu tiên.

Name
là tên của nút.

NodeType
là một thành viên thuộc kiểu liệt kê
System.Xml.XmlNodeType
, cho biết kiểu
của nút (phần tử, đặc tính, text ).

Value
là nội dung của nút, nếu đó là nút text hay nút CDATA.

Attributes
là tập hợp các nút mô tả các đặc tính được áp dụng cho phần tử.

InnerText
là chuỗi chứa giá trị (text) của nút hiện hành và tất cả các nút lồng bên trong.

InnerXml
là chuỗi chứa thẻ đánh dấu XML cho tất cả các nút lồng bên trong.

OuterXml
là chuỗi chứa thẻ đánh dấu XML cho nút hiện hành và tất cả các nút lồng bên
trong.
Ví dụ dưới đây duyệt qua tất cả các nút của một
XmlDocument
(bằng thuộc tính

ChildNodes

một phương thức đệ quy) rồi hiển thị chúng trong một
TreeView
.
using System;
using System.Windows.Forms;
using System.Xml;
public class XmlTreeDisplay : System.Windows.Forms.Form{
private System.Windows.Forms.Button cmdLoad;
private System.Windows.Forms.Label lblFile;
private System.Windows.Forms.TextBox txtXmlFile;
private System.Windows.Forms.TreeView treeXml;
// (Bỏ qua phần mã designer.)
private void cmdLoad_Click(object sender, System.EventArgs e) {

// Xóa cây.
treeXml.Nodes.Clear();
// Nạp tài liệu XML.
XmlDocument doc = new XmlDocument();
try {
doc.Load(txtXmlFile.Text);
}catch (Exception err) {

×